Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中使用switch的问题_Java_Logic_Switch Statement - Fatal编程技术网

在Java中使用switch的问题

在Java中使用switch的问题,java,logic,switch-statement,Java,Logic,Switch Statement,我不明白为什么它总是返回arg1的值。我正在建造一个重量转换器 public double convert(double arg1,int arg2,int arg3) { // arg1 = amount, arg2 = from, arg3 = to double milligram = 1; double gram = 1000; double ounce = 28349.5; double pound = 453592; double an

我不明白为什么它总是返回arg1的值。我正在建造一个重量转换器

public double convert(double arg1,int arg2,int arg3) {
    // arg1 = amount, arg2 = from, arg3 = to
    double milligram = 1;
    double gram = 1000;
    double ounce = 28349.5;
    double pound = 453592;
    double answer = 0;
    switch(arg2) {
    case 0: switch(arg3) { // if milligram
            case 0: answer = (arg1 * milligram) / milligram;
            case 1: answer = (arg1 * milligram) / gram;
            case 2: answer = (arg1 * milligram) / ounce;
            case 3: answer = (arg1 * milligram) / pound;
    }
    case 1: switch(arg3) { // if gram
            case 0: answer = (arg1 * gram) / milligram;
            case 1: answer = (arg1 * gram) / gram;
            case 2: answer = (arg1 * gram) / ounce;
            case 3: answer = (arg1 * gram) / pound;
    }
    case 2: switch(arg3) { // if ounce
            case 0: answer = (arg1 * ounce) / milligram;
            case 1: answer = (arg1 * ounce) / gram;
            case 2: answer = (arg1 * ounce) / ounce;
            case 3: answer = (arg1 * ounce) / pound;
    }
    case 3: switch(arg3) { // if pound
            case 0: answer = (arg1 * pound) / milligram;
            case 1: answer = (arg1 * pound) / gram;
            case 2: answer = (arg1 * pound) / ounce;
            case 3: answer = (arg1 * pound) / pound;
    }
    } // end arg2 switch
    return answer;
}
我把我的逻辑搞砸了,但我不知道在哪里。
任何帮助都将不胜感激。

您缺少
break
语句:

case 0: 
   answer = (arg1 * milligram) / milligram;
   break;
   ...

您缺少
break
语句:

case 0: 
   answer = (arg1 * milligram) / milligram;
   break;
   ...

嵌套的case语句很难阅读,也很难调试。最好将您需要的功能封装到方法调用中


也就是说,在交换机的任何地方都没有
break
语句。不管是哪种情况,它都会一直到最后一种情况(将答案设置为该情况的底部)。

嵌套的case语句很难阅读,也很难调试。最好将您需要的功能封装到方法调用中


也就是说,在交换机的任何地方都没有
break
语句。不管是哪种情况,它都会一直延续到最后一种情况(将答案设置为与案例底部相等)。

像这样重写每个案例

case 2: switch(arg3) { // if ounce
        case 0: answer = (arg1 * ounce) / milligram;break;
        case 1: answer = (arg1 * ounce) / gram;break;
        case 2: answer = (arg1 * ounce) / ounce;break;
        case 3: answer = (arg1 * ounce) / pound;break;

像这样重写每一个案例

case 2: switch(arg3) { // if ounce
        case 0: answer = (arg1 * ounce) / milligram;break;
        case 1: answer = (arg1 * ounce) / gram;break;
        case 2: answer = (arg1 * ounce) / ounce;break;
        case 3: answer = (arg1 * ounce) / pound;break;

您应该在switch语句中使用
break
,否则您的结果可能会被降级

您应该在switch语句中使用
break
,否则您的结果可能会被降级

,而不是使用
break
,使用
return
语句不仅可以实现这一点,还可以防止案例失败

case 2: switch(arg3) { // if ounce
    case 0: return (arg1 * milligram) / milligram;

除了使用
break
之外,使用
return
语句不仅可以实现这一点,还可以防止案例失败

case 2: switch(arg3) { // if ounce
    case 0: return (arg1 * milligram) / milligram;

为什么不直接命名参数amount、from和to呢?在这种情况下,最好使用数组并删除所有开关。类似于
answer=(arg1*conv[arg2])/conv[arg3]@IRelephant我更喜欢使用switch语句,因为它们更容易理解。我已经很长时间没有使用它们了,所以我完全忘记了必须打破每种情况。我只是建议这样做,因为您可以将代码从大约30行减少到2:-)为什么不直接命名参数的数量,从和到?在这种情况下,最好使用数组并完全删除开关。类似于
answer=(arg1*conv[arg2])/conv[arg3]@IRelephant我更喜欢使用switch语句,因为它们更容易理解。我已经很长时间没有使用它们了,所以我完全忘记了必须打破每个案例。我只是建议这样做,因为您可以将代码从大约30行减少到2:-)