문제

I'm writing a program that reads in a list of numbers. Such as:

45
63
74g
34.7
75

I simply want my program to skip lines that contain any letters in them. Any help would be greatly appreciated. Thanks!

If it makes a difference, here is my code:

import java.io.*;

public class ScoreReader {

    public static void main(String[] args) {
        BufferedReader reader = null;

        try {
            String currentLine;

            reader = new BufferedReader(new FileReader("QuizScores.txt"));
            while ((currentLine = reader.readLine()) != null) {

                int sum = 0;

                String[] nums = currentLine.split("\\s+");
                for (int i = 0; i < nums.length; i++) {
                    int num = Integer.parseInt(nums[i]);
                    if (num != -1) {
                        sum += num;
                    }
                }

                System.out.println(sum / nums.length);
            }
        } catch (IOException err) {
            err.printStackTrace();
        } 
        catch (NumberFormatException err) {

        }

        finally {
            try {
                if (reader != null)
                    reader.close();
            } catch (IOException err) {
                err.printStackTrace();
            }
        }

    }
}
도움이 되었습니까?

해결책

When an exception is thrown, execution jumps to the catch block. In what you have, this is after the loop, so the loop doesn't continue, just add a try around parseInt.

try {
   String currentLine;

   reader = new BufferedReader(new FileReader("QuizScores.txt"));
   while ((currentLine = reader.readLine()) != null) {

       int sum = 0;
       String[] nums = currentLine.split("\\s+");
       for (int i = 0; i < nums.length; i++) {
           try{
               int num = Integer.parseInt(nums[i]);
               if (num != -1) {
                   sum += num;
               }
           } catch( NumberFormatException nfe )
           {
              // maybe log it?
           }
       }

       System.out.println(sum / nums.length);
   }
} catch (IOException err) {
    err.printStackTrace();
} 
// catch (NumberFormatException err) {}
finally {
    try {
       if (reader != null){
           reader.close();
    } catch (IOException err) {
        err.printStackTrace();
    }
}

Also note, you are using Integer.parseInt which will throw an exception with the input "34.7", so maybe you wish to use Double.parseDouble

다른 팁

How about using a regex? Like for example:

 if (currentLine.matches(".*[a-zA-Z].*")) {
     //letters contained.
 } else {
     //no letters contained.
 }

see regex demo: http://regex101.com/r/rQ6oR1

you can try this :

 import java.io.*;

    public class ScoreReader {

        public static void main(String[] args) {
            BufferedReader reader = null;

            try {
                String currentLine;

                reader = new BufferedReader(new FileReader("QuizScores.txt"));
                while ((currentLine = reader.readLine()) != null) {

                    int sum = 0;

                    String[] nums = currentLine.split("\\s+");
                    for (int i = 0; i < nums.length; i++) {

                        if (isInt(num)) {
                            sum += num;
                        }
                    }

                    System.out.println(sum / nums.length);
                }
            } catch (IOException err) {
                err.printStackTrace();
            } 


            finally {
                try {
                    if (reader != null)
                        reader.close();
                } catch (IOException err) {
                    err.printStackTrace();
                }
            }

        }

public boolean isInt(String num)

    {
        boolean flag=false;


        try
        {
            int i=Integer.parseInt(num);
            flag=true;
        }

        catch(NumberFormatException e)
        {
            e.printStackTrace();

        }

        return flag;
    }

    }

Based on your comment. if your file contain one number per line . then this would be easiest way.

Scanner sc = new Scanner(new File("QuizScores.txt"));
        int sum = 0;
        int count =0;
        while( sc.hasNext()){
            String tmpNum = sc.next();
            if (isNumeric(tmpNum)){
                sum = sum + (int) Double.parseDouble(tmpNum); // if you want t capture in double use Double instead.
                count++;
            }
        }
        System.out.println(sum/count);


public static boolean isNumeric(String str)
    {
        return str.matches("-?\\d+(\\.\\d+)?");  //match a number with optional '-' and decimal.
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top