java - 如果我关闭第一个扫描仪并创建一个新的扫描仪,Scanner.nextLine() 会引发异常

标签 java java.util.scanner user-input

我想实现一个程序,它从用户输入中读取两个字符串。

        try 
    {
        System.out.println( "please enter a valid URL ( i.e. http://www.uibk.ac.at )" );
        Scanner inputScanner = new Scanner( System.in );
        String urlString = inputScanner.next(); 
        asciiTable = new int[NUM_ASCII_CHAR];
        URL url = new URL( urlString );
        URLConnection connection = url.openConnection();
        connection.connect();
        InputStreamReader in = new InputStreamReader( url.openStream() );
        countCharactersfromFile( in );
        printAsciiTable( asciiTable );
        printNumberOfChars( asciiTable );
        inputScanner.close();
        in.close();
    }
    // it has not the form of an URL
    catch ( MalformedURLException e ) 
    {
        e.printStackTrace();
    }
    // If the site cannot be connected
    catch( UnknownHostException e )
    {
        e.printStackTrace();
    }
    // some IO-Error occurs
    catch ( IOException e ) 
    {
        e.printStackTrace();
    }
    // if the ASCII array is empty
    catch( EmptyListException e )
    {
        e.printStackTrace();
    }
    catch( IllegalArgumentException e )
    {
        e.printStackTrace();
    }
    catch ( Exception e ) 
    {
        e.printStackTrace();
    }
    try
    {
        System.out.println( "Please enter the name of a file " );
        asciiTable = new int[NUM_ASCII_CHAR];
        Scanner scanner = new Scanner( System.in );
        String fileString = scanner.next();
        FileInputStream fileStream = new FileInputStream( fileString );
        InputStreamReader in = new InputStreamReader( fileStream );
        countCharactersfromFile( in );
        printAsciiTable( asciiTable );
        printNumberOfChars( asciiTable );
        scanner.close();        
    }
    catch ( IOException e ) 
    {
        e.printStackTrace();
    }
    catch( EmptyListException e )
    {
        e.printStackTrace();
    }
    catch( IllegalArgumentException e )
    {
        e.printStackTrace();
    }
    catch ( Exception e ) 
    {
        e.printStackTrace();
    }

首先我想让你知道我知道这个问题。我应该在我的程序中只使用 1 个扫描仪。但是,如果在我的程序中仅使用一个 try block ,如果抛出异常,我将不允许执行任务的第二部分。 我有一个解决方案,但我不知道它是否好。

try
{
    Scanner inputScanner = new Scanner( System.in );
    try
    {
        //the URL code, use inputScanner here
    }
    catch()
    {

    }
    try
    {
        // The file code, use inputscanner here
    }
    catch()
    {

    }
    inputscanner.close();
}
catch()

上面显示的解决方案是好的吗?或者您对于我的问题有更好的解决方案吗?

谢谢 帕特里克

最佳答案

为了确保 Scanner 始终关闭,请将使用它的所有代码包装到 try block 中,然后在 finally block 中将其关闭:

Scanner inputScanner = new Scanner(System.in);
try {
    try {
        // 1st operation
    } catch (Exception e) {
        System.err.println("1st operation failed");
    }
    try {
        // 2nd operation
    } catch (Exception e) {
        System.err.println("2nd operation failed");
    }
} finally {
    inputScanner.close();
}

或者使用 try-with-resource,效果相同:

try (Scanner inputScanner = new Scanner(System.in)) {
    ...
}

最好根本不要关闭inputScanner。您将无法从标准输入读取任何其他内容。扫描程序不会消耗任何额外的系统资源,因此您可以让垃圾收集器担心它。

附加提示:如果您没有对异常做任何有用的事情,请不要捕获异常。就让他们传播吧。您甚至可以声明 main 方法来抛出 Exception

关于java - 如果我关闭第一个扫描仪并创建一个新的扫描仪,Scanner.nextLine() 会引发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23983190/

相关文章:

java - OSGI 是否解决了 Java 中缺少 AppDomain 的问题?

java - 计时器无法正确触发

java - 'else' 中的语句被打印多次,但我希望当 'if' 错误时它只打印一次

java - 使用 hasNextInt 计算整数

Java:如何在不使用 actionListener 的情况下检测到用户已经完成了他们的保存名称?

java - 结果集为 List<Product> 和 List<Map<String, String>>

java - 在 GUI 中使用 GA

java - 使用扫描仪和开关盒找不到符号

java - 根据用户输入从LinkedList获取值

c# - 检查文本框是否为空