读取不同类型的变量时扫描程序异常

时间:2016-09-18 10:09:04

标签: java java.util.scanner

我有这样一个文件:

   private void ShowToastButton_Click(object sender, RoutedEventArgs e)
    {

        string toastXmlString=$@"
    <toast action='submit'>
        <visual>
            <binding template='ToastGeneric'>
                <text hint-maxLines='1'>Line1</text>
                <text>Line2</text>
            </binding>
        </visual>
        <actions>
            <input id='textBox' type='text' placeHolderContent='text' />
            <action
                content='Submit'
                hint-inputId='textBox'
                arguments='action=text' />
        </actions>
    </toast>";

        Windows.Data.Xml.Dom.XmlDocument toastCustomtXml = new Windows.Data.Xml.Dom.XmlDocument();
        toastCustomtXml.LoadXml(toastXmlString);

        // Create the toast and attach event listeners
        ToastNotification toast = new ToastNotification(toastCustomtXml);
        toast.Activated += ToastActivated;
        toast.Dismissed += ToastDismissed;
        toast.Failed += ToastFailed;

        // Show the toast. Be sure to specify the AppUserModelId on your application's shortcut!
        ToastNotificationManager.CreateToastNotifier(APP_ID).Show(toast);
    }

    private void ToastActivated(ToastNotification sender, object e)
    {
        // This event is fired, but I can't extract the textbox text
        // 'e' is a ToastActivatedEventArgs object, e.Arguments == 'action=text'

        Dispatcher.Invoke(() =>
        {
            Activate();
            Output.Text = "The user activated the toast.";
        });
    }

这就是我尝试阅读它的方式:

3
0.1
0.4
1

在我的代码的第三行抛出InputMismatchException。我知道我可以使用readLine()并将其解析为int或double,但如果我的文件看起来像是不可行的话:

InputStream s = Main.class.getResourceAsStream("/file.txt");
Scanner scanner = new Scanner(s);
//Scanner scanner = new Scanner(path); **EDITED**
System.out.println(scanner.nextInt());
System.out.println(scanner.nextDouble());
System.out.println(scanner.nextDouble());
System.out.println(scanner.nextInt());

在这种情况下,同一个地方会抛出相同的异常。

4 个答案:

答案 0 :(得分:2)

根据您的描述,它看起来像是一个区域设置问题。正如Scanner docs所述:

  

此类的实例能够扫描标准格式的数字以及扫描程序语言环境的格式。扫描程序的初始区域设置是Locale.getDefault()方法返回的值;它可以通过useLocale(java.util.Locale)方法更改。 reset()方法会将扫描程序的语言环境的值重置为初始语言环境,无论之前是否已更改。

我假设您的默认语言环境是波兰语语言环境,小数点分隔符是逗号。您可能希望更改输入文件以使用区域设置小数分隔符或使用小数分隔符为点的区域设置。例如,您可以在Scanner初始化后添加以下行:

scanner.useLocale(Locale.US);

答案 1 :(得分:0)

确保使用FileInputStream来源设置路径。

Scanner scanner = new Scanner(new File("path/filename.ext"));

System.out.println(scanner.nextInt());
System.out.println(scanner.nextDouble());
System.out.println(scanner.nextDouble());
System.out.println(scanner.nextInt());

答案 2 :(得分:0)

我无法重现此错误。请考虑以下示例:

$ cat -A file
3$
0.1$
0.4$
1$

$ cat -A file2
5 0.1$
0.4$
1$

$ cat Test.java

import java.io.*;
import java.util.Scanner;

public class Test
{
  public static void main(String args[]) throws Exception {

    InputStream s = Test.class.getResourceAsStream(args[0]);
    Scanner scanner = new Scanner(s);
    System.out.println(scanner.nextInt());
    System.out.println(scanner.nextDouble());
    System.out.println(scanner.nextDouble());
    System.out.println(scanner.nextInt());

  }
}

$ javac Test.java 

$ java Test file
3
0.1
0.4
1

$ java Test file2
5
0.1
0.4
1

您发布的代码应该按预期工作。

答案 3 :(得分:0)

感谢一些建议,我发现问题是Windows&#39;行分隔符。而不是&#34; \ n&#34; Windows打印&#34; \ r \ n&#34;这是扫描仪无法使用的。我在Git Bash中检查了我的文件:

$ cat -A file.txt
3^M$
0.1^M$
0.4^M$
1

它应该看起来:

$ cat -A file.txt
3$
0.1$
0.4$
1

修改

事实证明,行分隔符与它无关。用户&#34; acm&#34;注意到它是一个语言环境问题 - 在波兰默认的小数点分隔符是逗号。非常感谢!