【问题标题】:auto closable not working with Scanner自动关闭不适用于扫描仪
【发布时间】:2015-08-14 21:59:45
【问题描述】:

package org.test;

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class RegTest {
    public static void main(String[] args) throws InterruptedException {
        String str = readLine("Enter String :");
        String patternString = readLine("Enter pattern to search :");

        Pattern pattern = Pattern.compile(patternString);
        Matcher matcher = pattern.matcher(str);

        System.out.print("match positions: "); // matches positions
        while(matcher.find()) {
            System.out.print(matcher.start() + " ");
        }
        System.out.println("");
    }


    static String readLine(String message){
        String strLine;
            try (Scanner in = new Scanner(System.in)) {
                System.out.println(message);
                strLine= in.nextLine();
            }
        return strLine;
    }
}

没用。

输出是:

输入字符串:
呸呸呸
输入要搜索的模式:
线程“主”java.util.NoSuchElementException 中的异常:未找到行
在 java.util.Scanner.nextLine(Scanner.java:1585)
在 org.test.RegTest.readLine(RegTest.java:39)
在 org.test.RegTest.main(RegTest.java:22)

【问题讨论】:

    标签: java.util.scanner autocloseable


    【解决方案1】:

    当 try-with-resources (autoclosable) 关闭扫描器时,它也会关闭输入流,使其在未来无法使用。

    由于 System.in 是一个全局输入流,这意味着第二个扫描器无法从输入流中读取任何内容,因为它已关闭并引发异常。

    我会更改代码以重复使用 sanner 进行两次读取。

    public static void main(String[] args) throws InterruptedException {
        try (Scanner in = new Scanner(System.in)) {
            String str = readLine(in, "Enter String :");
            String patternString = readLine(in, "Enter pattern to search :");
    
            Pattern pattern = Pattern.compile(patternString);
            Matcher matcher = pattern.matcher(str);
    
            System.out.print("match positions: "); // matches positions
            while (matcher.find()) {
                System.out.print(matcher.start() + " ");
            }
            System.out.println("");
        }
    
    }
    
    static String readLine(Scanner in, String message) {
        String strLine;
        System.out.println(message);
        strLine = in.nextLine();
        return strLine;
    }
    

    【讨论】:

    • 谢谢!这会有所帮助。
    猜你喜欢
    • 2014-06-29
    • 2012-08-08
    • 2023-04-05
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多