class Patmatch {
static String strLine="";
public static void main(String [] args) {
try {
FileInputStream fstream = new FileInputStream("c://abc.txt");
DataInputStream in = new DataInputStream(fstream);
BufferedReader br1 = new BufferedReader(new InputStreamReader(in));
while ((strLine = br1.readLine()) != null) {
try {
Patternmatch();
}
catch(NomatchException me) {
System.out.println(me.getMessage());
}
}
in.close();
}
catch(IOException i) {
System.out.println("exec:"+i);
}
}
private static void Patternmatch() throws NomatchException {
Pattern p = Pattern.compile("---");
Matcher m = p.matcher(strLine);
if(m.find()) {
System.out.print(m.start());
}
else {
throw new NomatchException("no match");
}
}
}
class NomatchException extends Exception {
NomatchException(String s) {
super(s);
}
}
在上面的代码中,Exception没有打印两次匹配。
我有abc.txt,我没有这种模式---。
我可以理解,在那个main
我已经抓住了这个异常并且在NomatchException()
我已经抛出但是如果我删除try...catch
它会显示错误,如果删除nomatchException()
没有显示任何内容。
我现在应该怎么做才能纠正它?
答案 0 :(得分:2)
您只需拨打System.out.print()
一次,但是您是在while
循环中进行的。也许你在abc.txt
的末尾有额外的行,这会导致你的循环继续。
编辑回应评论:
即使我有这么多行例外,我应该打印一次但是如果我有 - 在很多地方都必须打印所有这些位置?
首先 - 请注意,不应使用例外来控制程序的流程 - 通常,它们仅在特殊情况下发生。
现在,如果您想表明您在abc.txt
中找到至少 1个不匹配的行,那么您可以重新设计您的程序,以便Patternmatch()
返回一个boolean
结果,根据该返回值,您可以增加一个新的errorCnt
字段。如果此新计数器大于零,您可以打印信息性消息。
但是,如果您想简单地省略在文本中出现空行的错误,可以在Patternmatch()
方法中进行简单测试,以测试trim()
'd的长度字符串:
if (strLine.trim().length() > 0 ) {
//do your test
}
另外 - 关于Java命名的说明。类名以大写字母开头(因此nomatchException
应为NomatchException
),方法名称以小写字母开头(Patternmatch()
应为patternmatch()
)。
答案 1 :(得分:0)
我同意akf - 异常应该是例外。控制逻辑流程的另一种方法可能是:
while (((strLine = br1.readLine()) != null)) {
if (!Patternmatch())
System.out.println("no match");
}
并修改您的Patternmatch()
private static boolean Patternmatch() throws NomatchException {
Pattern p = Pattern.compile("---");
Matcher m = p.matcher(strLine);
return m.find();
}
答案 2 :(得分:0)
文本文件中必须有两行不匹配。
正如其他人所说,这是对例外情况的不良使用。让patternMatch()方法返回一个布尔值。