如何在读取特定标记时停止循环而不跳到下一个标记?

Jor*_*dyn 2 java file while-loop java.util.scanner

我正在阅读的文件String后跟int一行,然后继续,直到它到达这个字符:*

例如:

A 1300
B 1200
C 1100
D 1000
*
Run Code Online (Sandbox Code Playgroud)

我需要它来停止读取文件,并在它到达星星时停止循环.当我执行if语句时,它没有读入*,它将按预期跳到下一行,但这会导致与读入的下一个标记的对齐问题.

这是我的代码:

static GradingScale reportCard = new GradingScale();
public static void main(String[] args) {
    readInputFile();
    javax.swing.JOptionPane.showMessageDialog(null,reportCard.toString());
}

public static void readInputFile(){
    try{
        Scanner file = new Scanner(new File("grades.txt"));
        int maxPoints = file.nextInt();
        reportCard.setMaxPoints(maxPoints);
        while(!file.hasNext("*")){
                String grade = file.next();
                int points = file.nextInt();
                double percent = points/(maxPoints*1.0);
                reportCard.addGradeLevel(grade, points, percent); 
        }
    }
    catch(java.io.FileNotFoundException fnfe){
        javax.swing.JOptionPane.showMessageDialog(null, "File not found");
    }

}
Run Code Online (Sandbox Code Playgroud)

我尝试使用该hasNext(Pattern)方法,但我不断收到此错误:

at java.util.regex.Pattern.error(Pattern.java:1955)
at java.util.regex.Pattern.sequence(Pattern.java:2123)
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.hasNext(Scanner.java:1400)
at mp1.MP1.readInputFile(MP1.java:32)
at mp1.MP1.main(MP1.java:23)
Run Code Online (Sandbox Code Playgroud)

这导致了这个:

private void dispatchUncaughtException(Throwable e) {
    getUncaughtExceptionHandler().uncaughtException(this, e);
}
Run Code Online (Sandbox Code Playgroud)

我做错了这个方法还是应该完全做其他事情?

我是java的新手,所以请尽量让它变得容易理解.如果这很难读,我道歉; 这是我的第一篇文章.

Cod*_*der 5

Scanner#hasNext(String)接受正则表达式模式.

但你似乎需要搜索文字*.

所以逃避它,

Scanner.hasNext("\\*");
Run Code Online (Sandbox Code Playgroud)

要么

Scanner.hasNext(Pattern.quote("*"));
Run Code Online (Sandbox Code Playgroud)