【问题标题】:Unclosed character class near index 525 [closed]索引 525 附近的未封闭字符类 [关闭]
【发布时间】:2016-09-16 18:43:34
【问题描述】:

总的来说,我是一个新程序员,如果这个问题有点基础,请原谅我。

该程序的目标是简单计算“最佳体重”,并在运行时不断抛出异常,超过第 35 行中的 a 和 b 字符串比较。我尝试删除逻辑运算符,但似乎仍然没有成为问题。我哪里错了?

import java.util.*;

public class WeightCalc {

  //Initialize variables
  static int feet = 0, inches = 0, totalWeight = 0;
  static boolean isMale;

  public static void optimalWeight(){
    // Calculate optimal weight
    if (isMale == true){
      if (feet >= 5){
        totalWeight = 106 + 6*(inches);
      } else{
        System.out.print("Error, you're a midget.");
      }
    }
    if (isMale == false){  
      if (feet >= 5){
        totalWeight = 100 + 5*(inches);
      } else{
        System.out.print("Error, you're a midget.");
      }
    }
  }

  public static void main(String[] args){

    String a = "Male", b = "male";

    // Initialize kboard Scanner
    Scanner kboard = new Scanner(System.in);

    // Ask for gender and assign isMale
    System.out.println("What is your gender? ");
    String gender = kboard.nextLine();
    if (gender.equals(a) || gender.equals(b)){
      isMale = true;
    }else {
      isMale = false;
    }

    // Ask for height, first feet, then inches
    System.out.println("What is your height in regards to feet? ");
    kboard.nextInt(feet);
    System.out.println("What is your remaining h eight in inches? ");
    kboard.nextInt(inches);

    //Call optimalWeight method and run
    optimalWeight();

    // Print the output
    System.out.println("Your optimal weight should be " + totalWeight + ".");

    // Set isMale opposite to what it was before and calculate opposite sex's potential weight
    isMale = !isMale;
    optimalWeight();

    // Print the output of the second run
    System.out.println("If you were of the opposite sex, your weight would be " + totalWeight + ".");

    // Close the Scanner variable
    kboard.close();
  }
}

【问题讨论】:

  • 第 35 行是哪一行? if (gender.equals(a) || gender.equals(b)){?还有什么例外?
  • 不要使用a == truea == false 比较布尔值。只需使用a!a
  • 再次检查您的行号,因为if (gender.equals(a) || gender.equals(b)) 行中有no 正则表达式处理。更有可能的是,它在kboard.nextInt(feet) 行中,应该是feet = kboard.nextInt()
  • 我认为这实际上是 OpenJDK 中的一个错误——与其说是行为,不如说是神秘的错误。似乎setRadix 方法可以检查radix < 2。但是,这可能不是常见的问题。
  • @AndyTurner Integer.parseInt(String s, int radix) 定义它将抛出 NumberFormatException 用于错误的基数值,nextInt(int radix) 定义它将调用 parseInt(),所以他们可能依赖于它的验证,而不是意识到正则表达式对于0 基数会变坏之前它可以调用parseInt()

标签: java regex patternsyntaxexception


【解决方案1】:

这一行:

kboard.nextInt(feet);

应该是

feet = kboard.nextInt();

当您向Scanner.nextInt 提供一个int 参数时,它被认为是您要输入的数字的基数。 feet 的值为零,你不能真正有一个基数为零的数字,因此会出现错误。


注意错误doesn't occur on the line you claim:

Exception in thread "main" java.util.regex.PatternSyntaxException: Unclosed character class near index 525
(([-+]?(((((?i)[]|\p{javaDigit})++)|([\p{javaDigit}&&[^0]]((?i)[]|\p{javaDigit})?((?i)[]|\p{javaDigit})?(\,((?i)[]|\p{javaDigit})((?i)[]|\p{javaDigit})((?i)[]|\p{javaDigit}))+)))))|(((((?i)[]|\p{javaDigit})++)|([\p{javaDigit}&&[^0]]((?i)[]|\p{javaDigit})?((?i)[]|\p{javaDigit})?(\,((?i)[]|\p{javaDigit})((?i)[]|\p{javaDigit})((?i)[]|\p{javaDigit}))+)))|(\Q-\E((((?i)[]|\p{javaDigit})++)|([\p{javaDigit}&&[^0]]((?i)[]|\p{javaDigit})?((?i)[]|\p{javaDigit})?(\,((?i)[]|\p{javaDigit})((?i)[]|\p{javaDigit})((?i)[]|\p{javaDigit}))+)))
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             ^
    at java.util.regex.Pattern.error(Pattern.java:1955)
    at java.util.regex.Pattern.clazz(Pattern.java:2548)
    at java.util.regex.Pattern.clazz(Pattern.java:2504)
    at java.util.regex.Pattern.clazz(Pattern.java:2504)
    at java.util.regex.Pattern.clazz(Pattern.java:2504)
    at java.util.regex.Pattern.clazz(Pattern.java:2504)
    at java.util.regex.Pattern.clazz(Pattern.java:2504)
    at java.util.regex.Pattern.clazz(Pattern.java:2504)
    at java.util.regex.Pattern.clazz(Pattern.java:2504)
    at java.util.regex.Pattern.clazz(Pattern.java:2504)
    at java.util.regex.Pattern.clazz(Pattern.java:2504)
    at java.util.regex.Pattern.clazz(Pattern.java:2504)
    at java.util.regex.Pattern.clazz(Pattern.java:2504)
    at java.util.regex.Pattern.clazz(Pattern.java:2504)
    at java.util.regex.Pattern.clazz(Pattern.java:2504)
    at java.util.regex.Pattern.clazz(Pattern.java:2504)
    at java.util.regex.Pattern.clazz(Pattern.java:2504)
    at java.util.regex.Pattern.clazz(Pattern.java:2504)
    at java.util.regex.Pattern.clazz(Pattern.java:2504)
    at java.util.regex.Pattern.sequence(Pattern.java:2063)
    at java.util.regex.Pattern.expr(Pattern.java:1996)
    at java.util.regex.Pattern.group0(Pattern.java:2905)
    at java.util.regex.Pattern.sequence(Pattern.java:2051)
    at java.util.regex.Pattern.expr(Pattern.java:1996)
    at java.util.regex.Pattern.group0(Pattern.java:2905)
    at java.util.regex.Pattern.sequence(Pattern.java:2051)
    at java.util.regex.Pattern.expr(Pattern.java:1996)
    at java.util.regex.Pattern.group0(Pattern.java:2905)
    at java.util.regex.Pattern.sequence(Pattern.java:2051)
    at java.util.regex.Pattern.expr(Pattern.java:1996)
    at java.util.regex.Pattern.group0(Pattern.java:2905)
    at java.util.regex.Pattern.sequence(Pattern.java:2051)
    at java.util.regex.Pattern.expr(Pattern.java:1996)
    at java.util.regex.Pattern.group0(Pattern.java:2905)
    at java.util.regex.Pattern.sequence(Pattern.java:2051)
    at java.util.regex.Pattern.expr(Pattern.java:1996)
    at java.util.regex.Pattern.group0(Pattern.java:2905)
    at java.util.regex.Pattern.sequence(Pattern.java:2051)
    at java.util.regex.Pattern.expr(Pattern.java:1996)
    at java.util.regex.Pattern.compile(Pattern.java:1696)
    at java.util.regex.Pattern.<init>(Pattern.java:1351)
    at java.util.regex.Pattern.compile(Pattern.java:1028)
    at java.util.Scanner$1.create(Scanner.java:367)
    at java.util.Scanner$1.create(Scanner.java:365)
    at sun.misc.LRUCache.forName(LRUCache.java:72)
    at java.util.Scanner.integerPattern(Scanner.java:443)
    at java.util.Scanner.nextInt(Scanner.java:2117)
    at WeightCalc.main(Main.java:45)

倒数第二行:

java.util.Scanner.nextInt(Scanner.java:2117)

表明它在Scanner.nextInt

【讨论】:

  • 不重要的行是WeightCalc.main(Main.java:45),说明是第45行是罪魁祸首吗?
  • @Andreas 好吧,当然,但是您可以看到这是调用nextInt 的问题,而无需查看行号。
【解决方案2】:

你打错了Scanner.readInt。您想调用返回int 的空参数。

您调用的那个将int 作为输入,该输入应该是数字基数(即数字是八进制或二进制等)。由于feetinches 都初始化为0,它会尝试读取以0 为底的int,这是不可能的。

你想要的更像是:

// Ask for height, first feet, then inches 
System.out.println("What is your height in regards to feet? ");
feet = kboard.nextInt();
System.out.println("What is your remaining h eight in inches? ");
inches = kboard.nextInt();

【讨论】:

    猜你喜欢
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    • 2016-07-09
    相关资源
    最近更新 更多