【问题标题】:Scanning for char and using it in a condition扫描 char 并在条件下使用它
【发布时间】:2015-12-14 21:01:43
【问题描述】:

我一直在尝试使用以下代码通过 Scanner 获取 char

    import java.util.Scanner;

    public class PhoneBill
    {
        public static void main(String[] args)
        {

           // Create Scanner
           Scanner input = new Scanner (System.in);

           //Declare variables
           char r, p;
           double minutes, nightm, daym, totalcost, account;

           //Obtain account number
           account = input.nextDouble(); 

           //Determine service
           System.out.println("Enter r for regular service or p for premium service: ");
           char service = input.next(".").charAt(0);

           //Logic for regular service
           if (service == r)
           {
               System.out.println("Enter number of minutes talked: ");
               minutes = input.nextDouble();

               if (minutes >= 50)
                   totalcost = (10.00 + (minutes * 0.20));
           }  

           //Display account
           System.out.println ("The account number is: " + account);

           //Display service type


          }
    }

但我收到了这个错误:

PhoneBill.java:29: error: variable r might not have been initialized         
if (service == r)    
               ^
1 error

问题出在哪里以及如何以适当的方式解决?

【问题讨论】:

  • 你试过给r赋值吗?例如r = 'r'。就像错误消息说的那样,您还没有这样做,您需要先这样做才能引用它。甚至,您可以简单地使用if (service == 'r')

标签: java if-statement char


【解决方案1】:

你声明了一个变量 r,但你没有给它任何值。然后您尝试将服务与未初始化的变量进行比较。因此,您需要在使用 r 和 p 变量之前为其赋值。

【讨论】:

    【解决方案2】:

    您已经声明了一个变量r,并且需要先为其分配一个值才能使用它:

    char r = 'r';
    

    在这种情况下,您总是将输入 r 进行常规服务等(至少在您更改说明消息之前),您可以简单地使用字符文字 r 而不是一个变量:

    if (service == 'r') {
      // Do something.
    }
    

    但是,为了使您的代码更容易更改,您可能仍希望使用一个变量,以便您可以在一个地方更新它并让它自动更新所有相关位置。

    在这种情况下,您可以将其声明为:

    final char r = 'r';
    

    final 是可选的,但可以防止您意外更改它。使用更长的变量名来描述它的用途也是一个好主意,例如regular 而不是 r

    然后你可以写:

    System.out.println("Enter " + regular + " for regular service...");
    char service = /* ... Whatever ... */ ;
    if (service == regular) {
      // ... Whatever.
    }
    

    【讨论】:

      【解决方案3】:

      局部变量必须在使用前进行初始化(Java 语言规范强制要求),这意味着不能存在任何会导致使用未初始化变量的执行路径。

      要摆脱编译错误,您可以这样做:

      char r = 0, p = 0;
      

      虽然我们可以argue 这是否应该在 Java 语言中更好地处理,但编译器在这里帮了你一个忙:你的逻辑可能有错误,因为你使用的变量 不是 初始化任何地方

      【讨论】:

        【解决方案4】:

        在操作中使用变量之前,您必须初始化变量(对象和原始类型)。定义 r 和 p 为

        char r = 'r', p = 'p'; // 
        

        【讨论】:

        • 也许你可以扩展你的答案,解释为什么 OP 需要这样做?
        猜你喜欢
        • 1970-01-01
        • 2018-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-09
        相关资源
        最近更新 更多