Java 扫描字符并在特定条件下使用它

Java 扫描字符并在特定条件下使用它,java,if-statement,char,Java,If Statement,Char,我一直在尝试以下代码,以便使用Scanner获取字符: import java.util.Scanner; public class PhoneBill { public static void main(String[] args) { // Create Scanner Scanner input = new Scanner (System.in); //Decla

我一直在尝试以下代码,以便使用Scanner获取字符

    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和p定义为

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

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

您已经声明了一个变量
r
,并且在使用它之前需要为它赋值:

char r = 'r';
在这种情况下,如果您总是为常规服务等输入
r
(至少在您更改指令消息之前),您可以简单地使用字符literal
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.
}

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

要消除编译错误,可以执行以下操作:

char r = 0, p = 0;

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

你是否尝试过给
r
赋值?e、 g.
r='r'
。正如错误消息所说,您还没有这样做,您需要这样做,然后才能引用它。甚至,您也可以简单地使用
if(service=='r')
。也许您可以扩展您的答案,来解释OP为什么需要这样做?