2015-09-16 30 views
2

我读的文件具有String后跟int在同一行,然后继续,直到它达到这个人物:*如何在没有跳到下一个标记的情况下读取特定标记时停止循环?

例如:

A 1300 
B 1200 
C 1100 
D 1000 
* 

我需要它停止读取文件,一旦到达恒星就停止循环。当我做了一个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"); 
    } 

} 

我尝试使用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) 

导致此:

private void dispatchUncaughtException(Throwable e) { 
    getUncaughtExceptionHandler().uncaughtException(this, e); 
} 

我是在做一些错误的方法,或者我应该完全做其他事情吗?

我对java很陌生,所以请尽量让它尽可能容易理解。 如果这很难读,我很抱歉;这是我的第一篇文章。

回答

4

hasNext()的参数是一个正则表达式,而*是无效的正则表达式,因为星号表示前面的表达式为“零次或多次”,并且没有前面的表达式。

你必须逃离明星:hasNext("\\*")

备选:hasNext(Pattern.quote("*"))

Pattern的Javadoc有关正则表达式的更多信息。

5

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

但你似乎需要搜索文字*

因此,与逃避它,

Scanner.hasNext("\\*"); 

Scanner.hasNext(Pattern.quote("*")); 
+0

谢谢!那正是我期待的! – Jordyn

相关问题