首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >异常组织援助?

异常组织援助?
EN

Stack Overflow用户
提问于 2014-02-05 06:04:33
回答 2查看 65关注 0票数 1

我在这个网站上取得了一些成功,我希望我能找到更多优秀的程序员来帮助我。

所以我要用这个代码来结束我的智慧。我对编程非常陌生,尤其是例外。我仔细阅读了我的课程材料,并寻求帮助,但我一直很不成功。我正在尝试创建一个改进的解析器,它将覆盖另一个解析器。它读取一个包含学生信息的.txt文件,其中包括ID、名称、年级、可选的电子邮件地址和可选的注释,这些都是以逗号分隔的字符串中的标记形式。覆盖检查每个令牌中的错误,并抛出一个名为ParserException的异常。异常将检查代码,如果错误不可修复,则返回错误消息。

例如,如果学生为年级输入AB,则异常将标记并检查输入是否为有效年级(它是),然后返回,如果不是,则抛出一个ParserException,在本例中为throw new ParserException(ParserException.GRADE_INVALID_GRADE,lineIndex); --这表明输入不工作,并在indexLine行上发送消息GRADE_INVALID

我有一个输出需要的列表:

  • 任何违反上述“输入文件格式描述”部分中指定的文件格式的行为都应导致带有适当消息的ParcerException
  • 不允许重复的ID
  • 等级值必须是浮点数(92.0)或字母级别,而不是整数

我有所有的代码来纠正和检查错误,但我不知道如何让try开始工作。下面是重写代码:

代码语言:javascript
运行
复制
@Override
    public ParserResult parseLine(int lineIndex) {    
        String[] tokens = lines.get(lineIndex).split(",");
        ArrayList<Integer> idList = new ArrayList<Integer>();
        Integer studentId;
        String name;
        String grade;
        String email;
        String comments;
        boolean isFloat;
        float gradeFinal;
        String editName;
        studentId = new Integer(tokens[0]);
        ParserResult result;

        try{
            return super.parseLine(lineIndex);
        }
        catch(ParserException e){

            // Check reasonable number of tokens
            if(tokens.length >= 3 && tokens.length <= 5){

                name = tokens[1];
                grade = tokens[2];

                // Check the student ID
                if(idList.contains(studentId)){
                    throw new ParserException(ParserException.DUPLICATE_ID, lineIndex);
                }else{
                    idList.add(studentId);
                }

                // Check the grade
                if(grade.trim().equalsIgnoreCase("A")){
                    gradeFinal = gradeA;
                }else if(grade.trim().equalsIgnoreCase("AB")){
                    gradeFinal = gradeAB;
                }else if(grade.trim().equalsIgnoreCase("B")){
                    gradeFinal = gradeB;
                }else if(grade.trim().equalsIgnoreCase("BC")){
                    gradeFinal = gradeBC;
                }else if(grade.trim().equalsIgnoreCase("C")){
                    gradeFinal = gradeC;
                }else if(grade.trim().equalsIgnoreCase("CD")){
                    gradeFinal = gradeCD;
                }else if(grade.trim().equalsIgnoreCase("D")){
                    gradeFinal = gradeD;
                }else if(grade.trim().equalsIgnoreCase("F")){
                    gradeFinal = gradeF;
                }else{
                    try{
                        Integer.parseInt(grade);
                        isFloat = false;
                    }
                    catch(Exception fl) {
                        isFloat = true;
                    }
                    if(isFloat){
                        if((Float.parseFloat(grade) < 100f) && (Float.parseFloat(grade) >= 0f)){
                            gradeFinal = Float.parseFloat(grade);
                        }else{
                            throw new ParserException(ParserException.GRADE_INVALID_GRADE,lineIndex);
                        }
                    }else{
                        throw new ParserException(ParserException.GRADE_INTEGER_VALUE,lineIndex);
                    }
                }

                // Check the name
                if(name.split(" ").length > 3){
                    throw new ParserException(ParserException.UNKNOWN, lineIndex);
                }else{
                    editName = name.trim().split(" ")[0];
                }

                result = new ParserResult(studentId, editName, gradeFinal);

                // Checks the email
                if(tokens.length >= 4){
                    email = tokens[3];

                    // Check for at sign
                    if(!email.contains("@")){
                        throw new ParserException(ParserException.UNKNOWN, lineIndex);
                    }


                    int count = 0;
                    // Counts number of @ symbols
                    for(int i=0; i<email.length(); i++){
                        if(email.indexOf(i) == '@'){
                            count++;
                        }
                    }
                    if(count > 1){
                        throw new ParserException(ParserException.EMAIL_MULTIPLE_AT,lineIndex);
                    }
                    if(email.split(".").length == 2){
                        if(!(email.trim().split(".")[1].contains(".edu")) && !(email.trim().split(".")[1].contains(".com"))){
                            throw new ParserException(ParserException.EMAIL_NOT_EDU_OR_COM,lineIndex);
                        }else{
                            result.setEmail(email);
                        }
                    }
                    // Checks if email contains .com or .edu

                    // Checks the comments
                    if(tokens.length == 5){
                        comments = tokens[4];
                        result.setComment(comments);
                    }
                }

                return result;
            }
        }

        // TODO Call Parser's parseLine() here to attempt to parse, catch any exceptions

        return null;
    }

被重写但仍然使用的原始parseLine是:

代码语言:javascript
运行
复制
public ParserResult parseLine(int lineIndex) {
    String[] tokens = lines.get(lineIndex).split(",");
    ParserResult result = new ParserResult(Integer.parseInt(tokens[0]),
            tokens[1], Float.parseFloat(tokens[2]));
    result.setEmail(tokens[3]);
    return result;
}

下面是main()文件:

代码语言:javascript
运行
复制
public static void main(String[] args){

    // TODO Change the line below to use ImprovedParser 
    Parser parser = null;
    try {
        parser = new ImprovedParser(args[0]);
    } catch (FileNotFoundException e) {
        e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        System.exit(-1);
    }
    List<ParserResult> results = parser.parse();

    int count = results.size();
    double sum = 0.0;
    for (ParserResult result : results) {
        sum += result.getGrade();
    }

    System.out.println("Number of valid input lines: " + results.size());
    System.out.println("Number of invalid input lines: "
            + (parser.getLineCount() - results.size()));
    System.out.println("Average grade: " + sum / count);
    for (ParserResult result : results) {
        System.out.println(result);
    }

}

最后,下面是正在读取的.txt文件:

代码语言:javascript
运行
复制
# student_id,name,grade,email
1234,Bob,92.0,bob@test.edu
4321,Alice,95.0,alice@test.edu
1111,Eve,80.0,eve@test.edu
1121,Barry,85.0,barrytest.edu
1131,Harry,86.0,h@rry@test.edu
1121,Larry,87.0,larry@test.edu
1141,Jim Song,88.0,jim@song.edu
1151,Jerry,77.0,jerry@test.net
1161,James,65.0,james@test.com

最后六个输入应该会导致异常,但我不知道如何组织它来工作。代码忽略带有#符号的行。

下面是一个成功的输出示例:

代码语言:javascript
运行
复制
Number of valid input lines: 3
Number of invalid input lines: 0
Average grade: 89.0
1234, 92.0, Bob, bob@test.edu,
4321, 95.0, Alice, alice@test.edu,
1111, 80.0, Eve, eve@test.edu,

主要的改变应该是在orverride方法,如果可以请帮助,我坐在我的办公桌上仍在思考的可能性,您的帮助将是最感谢的。

EN

回答 2

Stack Overflow用户

发布于 2014-02-05 06:13:08

假设ParseException有一个error字段是一个抛出ParseExceptionintsomeMethod()

代码语言:javascript
运行
复制
try {
    someMethod();
} catch (final ParseExeption ex) {
    if (ex.getError() == ParseException.SOME_ERROR) {
        // do something
    } else if (ex.getError() == ParseException.OTHER_ERROR) {
        // do something else
    }
}

注意,通常对特定错误使用特定的异常比较好,比如SomeErrorParseExceptionOtherErrorParseException、.(如果您愿意的话,可以扩展ParseException )并尝试这样的捕获:

代码语言:javascript
运行
复制
try {
    someMethod();
} catch (final SomeErrorParseException ex) {
    // do something
} catch (final OtherErrorParseException ex) {
    // do something else
}

阅读:http://docs.oracle.com/javase/tutorial/essential/exceptions/index.html

票数 0
EN

Stack Overflow用户

发布于 2014-02-05 06:15:02

首先,似乎没有真正导致catch子句的代码。在读取文件时检测到错误时,尝试添加throw new ParserException(STUFF_HERE);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21569780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档