Unclosed string literal ошибка

Introduction to Strings & String Literals

Strings are a fundamental data type in most modern general-purpose programming languages. In Java, strings are defined as character sequences and are represented as immutable objects of the class java.lang.String which contains various constructors and methods for creating and manipulating strings [1]. A string literal is simply a reference to an instance of the String class, which consists of zero or more characters enclosed in double quotes. Moreover, a string literal is also a constant, which means it always refers to the same instance of the String class, due to interning [2]. Below is an example of the string literal "rollbar" being assigned to two different variables a and b which both reference the same (automatically interned) String object.

String a = "rollbar";
String b = "rollbar";
System.out.println(a == b); // true

For string literals to be interpreted correctly by the Java compiler, certain (so called “special”) characters need to be escaped by using the appropriate escape sequence (or escape for short) [3]. Such is the case with the double quote character, which is considered a special character as it is used to mark the beginning and the end of a string literal. So, in order to have quotes within these quotes, one must use the escape sequence \” on the inner quotes, as shown below.

System.out.println("Say \"Hi!\" to Rollbar."); // Say "Hi!" to Rollbar.

Unclosed String Literal Error: What It Is and Why It Happens?

As its name implies, the unclosed string literal error refers to a string literal which has not been closed. More specifically, this means that the Java compiler has failed to interpret a string literal due to being unable to locate the double quote expected to close i.e., mark the end of it. The message generated by the compiler indicates the line and the position where the opening quotation mark of the string literal in question is found.

The unclosed string literal error most commonly occurs when

  • a string literal doesn’t end with a double quote;
  • a string literal extends beyond a single line but is not concatenated properly; or
  • a double quote is part of the string literal itself but is not escaped properly.

Unclosed String Literal Error Examples

Missing double quotes at the end of a string literal

When the Java compiler encounters a double quote which denotes the start of a string literal, it expects to find a matching double quote that marks the end of it. In other words, double quotes always go in pairs, and failing to match an opening quote to a closing one will inevitably trigger the unclosed string literal error.

Fig. 1(a) shows how failing to mark the end of a string literal with a double quote results in the unclosed string literal error, and the error message points to the location where the opening quote appears in the code. Adding the omitted quote, as demonstrated in Fig. 1(b), closes the string literal and remedies the issue.

(a)

package rollbar;

public class UnclosedStringLiteral {

  public static void main(String... args) {
    System.out.println("This is a simple string literal.);
  }
}
UnclosedStringLiteral.java:6: error: unclosed string literal
    System.out.println("This is a simple string literal.);
                       ^
1 error

(b)

package rollbar;

public class UnclosedStringLiteral {

  public static void main(String... args) {
    System.out.println("This is a simple string literal.");
  }
}
This is a simple string literal.
Figure 1: Unclosed string literal (a) error and (b) resolution

Multiline string not concatenated properly

Oftentimes, a string holds textual content too long to be comfortably contained in a single line of code. This raises the need for truncating the string into multiple lines, and the most common way to do this in Java is by splitting the string up into multiple string literals concatenated with the plus (+) character.

Having a single string literal span multiple lines of code is syntactically incorrect, so failing to divide the string into separate, properly concatenated chunks will raise the unclosed string literal error, as can be observed in Fig. 2(a). Note how the compiler flags the second double quote on line 8 as the beginning of a new string literal, rather than the end of the previous one, as it sits on a different line. Encapsulating each sub-string into its own string literal and joining them with the plus character fixes the problem (Fig. 2(b)).

(a)

package rollbar;

public class UnclosedStringLiteralMultiline {

  public static void main(String... args) {
    System.out.println("This is a complete sentence
        represented as a multiline string
        in the Java programming language.");
  }
}
UnclosedStringLiteralMultiline.java:6: error: unclosed string literal
    System.out.println("This is a complete sentence
                       ^
UnclosedStringLiteralMultiline.java:7: error: ';' expected
        represented as a multiline string
                      ^
UnclosedStringLiteralMultiline.java:7: error: ';' expected
        represented as a multiline string
                                  ^
UnclosedStringLiteralMultiline.java:8: error: ';' expected
        in the Java programming language.");
          ^
UnclosedStringLiteralMultiline.java:8: error: ';' expected
        in the Java programming language.");
                   ^
UnclosedStringLiteralMultiline.java:8: error: ';' expected
        in the Java programming language.");
                                        ^
UnclosedStringLiteralMultiline.java:8: error: unclosed string literal
        in the Java programming language.");
                                         ^
7 errors

(b)

package rollbar;

public class UnclosedStringLiteralMultiline {

  public static void main(String... args) {
    System.out.println("This is a complete sentence " +
        "represented as a multiline string " +
        "in the Java programming language.");
  }
}
This is a complete sentence represented as a multiline string in the Java programming language.
Figure 2: Unclosed string literal in multiline string (a) error and (b) resolution

Unescaped double quotes inside string literal

As mentioned earlier, certain characters inside string literals need to be escaped in order to be interpreted correctly by the Java compiler. In the case of the double quote ("), it has to be escaped with a preceding backslash (\) so that it doesn’t get misinterpreted as the character marking the end of the string. Fig. 3 shows an example of a string literal containing the double quote character as its second-last character, and how failing to escape it with a backslash invokes the unclosed string literal error.

(a)

package rollbar;

public class UnclosedStringLiteralEscapeSequence {

  public static void main(String... args) {
    String text = "You have to escape ".";
    System.out.println(text);
 }
}
UnclosedStringLiteralEscapeSequence.java:6: error: unclosed string literal
    String text = "You have to escape ".";
                                        ^
UnclosedStringLiteralEscapeSequence.java:6: error: ';' expected
    String text = "You have to escape ".";
                                          ^
2 errors

(b)

package rollbar;

public class UnclosedStringLiteralEscapeSequence {

  public static void main(String... args) {
    String text = "You have to escape \".";
    System.out.println(text);
  }
}
You have to escape ".
Figure 3: Unclosed string literal with unescaped double quote (a) error and (b) resolution

Text Blocks to the Rescue

Many of the issues leading to the unclosed string literal error can be prevented by using text blocks, a relatively new feature added to the Java language specification [4]. A text block is a multi-line string literal that avoids the need for most escape sequences, automatically formats the string in a predictable way, and gives good control over the desired output. Text blocks were proposed in 2019 and became a preview feature in JDK 13 & 14, finally making their appearance as a permanent feature in JDK 15, in 2020 [5].

In Java, embedding a snippet of HTML, XML, SQL, or JSON in a string literal can be especially daunting as it tends to require significant editing with escapes and concatenation before the code can compile. Fig. 4(a) shows how such a snippet can be difficult to read and maintain, and how easily it could trigger the unclosed string literal error. Contrast this to the example in Fig. 4(b) which uses a text block to produce the same exact result.

(a)

1
2
3
4
5
6
7
8
9
10
11
12
package rollbar;

public class TextBlocks {
    public static void main(String... args) {
        String html = "<html>\n" +
                  "    <body>\n" +
                  "        <p>\"Hello world\"</p>\n" +
                  "    </body>\n" +
                  "</html>\n";
        System.out.println(html);
    }
}
<html>
    <body>
        <p>"Hello world"</p>
    </body>
</html>

(b)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package rollbar;

public class TextBlocks {

    public static void main(String... args) {
        String html = """
                      <html>
                          <body>
                              <p>"Hello world"</p>
                          </body>
                      </html>
                      """;
        System.out.println(html);
    }
}
<html>
    <body>
        <p>"Hello world"</p>
    </body>
</html>
Figure 4: A multiline HTML string as a (a) chain of string literals versus a (b) text block

It’s apparent how text blocks can improve the readability and writability of Java programs by providing a linguistic mechanism for denoting strings more precisely and elegantly, across multiple lines and without the visual clutter of escape sequences. Still, while some parts of a program may benefit from text blocks laid out over multiple lines, the embedded newline characters and whitespace padding may be undesirable in other parts of the program. Hence, both string literals and text blocks have their own use cases.

Conclusion

Strings are a widely used and hugely important device in writing Java programs. Being familiar with the relevant syntax rules is essential in avoiding related compilation errors, such as the unclosed string literal error. This error emerges when the compiler is unable to interpret a string because it can’t figure out where the associated string literal ends. This article helps understand and resolve this error by fixing the underlying syntax issues which provoke it. An alternative way to mitigate and prevent the unclosed string literal error is also proposed, by way of using a new JDK feature—text blocks—as a direct replacement for string literals in certain scenarios.

Track, Analyze and Manage Errors With Rollbar

Rollbar in action

Managing errors and exceptions in your code is challenging. It can make deploying production code an unnerving experience. Being able to track, analyze, and manage errors in real-time can help you to proceed with more confidence. Rollbar automates error monitoring and triaging, making fixing Java errors easier than ever. Sign Up Today!

References

[1] Oracle, 2020. String (Java SE 15 & JDK 15). Oracle and/or its affiliates. [Online]. Available: https://docs.oracle.com/en/java/javase/15/docs/api/java.base/java/lang/String.html. [Accessed Dec. 16, 2021]

[2] Wikipedia, 2021. String interning — Wikipedia. Wikipedia. [Online]. Available: https://en.wikipedia.org/wiki/String_interning. [Accessed Dec. 16, 2021]

[3] Oracle, 2020. The Java® Language Specification. Java SE 15 Edition. Chapter 3. Lexical Structure. Oracle and/or its affiliates. [Online]. Available: https://docs.oracle.com/javase/specs/jls/se15/html/jls-3.html#jls-3.10.7. [Accessed Dec. 16, 2021]

[4] J. Laskey and S. Marks, 2020. Programmer’s Guide to Text Blocks, Oracle and/or its affiliates. [Online]. Available: https://docs.oracle.com/en/java/javase/15/text-blocks/index.html. [Accessed Dec. 16, 2021]

[5] OpenJDK, 2020. JEP 378: Text Blocks. Oracle Corporation and/or its affiliates. [Online]. Available: https://openjdk.java.net/jeps/378. [Accessed Dec. 16, 2021]

оригинал:50 Common Java Errors and How to Avoid Them (Part 1)
Автор:Angela Stringfellow
перевод: Гусь напуган

Примечание переводчика: в этой статье представлены 20 распространенных ошибок компилятора Java. Каждая ошибка включает фрагменты кода, описания проблем и предоставляет ссылки по теме, которые помогут вам быстро понять и решить эти проблемы. Ниже приводится перевод.

При разработке программного обеспечения Java вы можете столкнуться со многими типами ошибок, но большинства из них можно избежать. Мы тщательно отобрали 20 наиболее распространенных ошибок программного обеспечения Java, включая примеры кода и руководства, которые помогут вам решить некоторые распространенные проблемы с кодированием.

Чтобы получить дополнительные советы и рекомендации по написанию программ на Java, вы можете загрузить наш «Comprehensive Java Developer’s Guide«Эта книга содержит все, что вам нужно, от всевозможных инструментов до лучших веб-сайтов и блогов, каналов YouTube, влиятельных лиц в Twitter, групп в LinkedIn, подкастов, мероприятий, которые необходимо посетить, и многого другого.

Если вы используете .NET, прочтите нашРуководство по 50 наиболее распространенным программным ошибкам .NETЧтобы избежать этих ошибок. Но если ваша текущая проблема связана с Java, прочтите следующую статью, чтобы понять наиболее распространенные проблемы и способы их решения.

Ошибка компилятора

Сообщения об ошибках компилятора создаются, когда компилятор выполняет код Java. Важно, что компилятор может выдавать несколько сообщений об ошибках для одной ошибки. Так что исправьте ошибку и перекомпилируйте, что может решить многие проблемы.

1. “… Expected”

Эта ошибка возникает, когда в коде чего-то не хватает. Обычно это происходит из-за отсутствия точки с запятой или закрывающей скобки.

private static double volume(String solidom, double alturam, double areaBasem, double raiom) {
double vol;
    if (solidom.equalsIgnoreCase("esfera"){
        vol=(4.0/3)*Math.pi*Math.pow(raiom,3);
    }
    else {
        if (solidom.equalsIgnoreCase("cilindro") {
            vol=Math.pi*Math.pow(raiom,2)*alturam;
        }
        else {
            vol=(1.0/3)*Math.pi*Math.pow(raiom,2)*alturam;
        }
    }
    return vol;
}

Обычно это сообщение об ошибке не указывает точное местонахождение проблемы. Чтобы найти проблему, вам необходимо:

  • Убедитесь, что все открывающие скобки имеют соответствующие закрывающие скобки.
  • Посмотрите на код перед строкой, обозначенной ошибкой. Эта ошибка обычно обнаруживается компилятором в более позднем коде.
  • Иногда некоторые символы (например, открывающая скобка) не должны быть первыми в коде Java.

Примеры:Ошибка из-за отсутствия скобок。

2. “Unclosed String Literal”

Если в конце строки отсутствует кавычка, создается сообщение об ошибке «Незамкнутый строковый литерал», и это сообщение отображается в строке, где произошла ошибка.

 public abstract class NFLPlayersReference {
    private static Runningback[] nflplayersreference;
    private static Quarterback[] players;
    private static WideReceiver[] nflplayers;
    public static void main(String args[]){
    Runningback r = new Runningback("Thomlinsion");
    Quarterback q = new Quarterback("Tom Brady");
    WideReceiver w = new WideReceiver("Steve Smith");
    NFLPlayersReference[] NFLPlayersReference;
        Run();// {
        NFLPlayersReference = new NFLPlayersReference [3];
        nflplayersreference[0] = r;
        players[1] = q;
        nflplayers[2] = w;
            for ( int i = 0; i < nflplayersreference.length; i++ ) {
            System.out.println("My name is " + " nflplayersreference[i].getName());
            nflplayersreference[i].run();
            nflplayersreference[i].run();
            nflplayersreference[i].run();
            System.out.println("NFL offensive threats have great running abilities!");
        }
    }
    private static void Run() {
        System.out.println("Not yet implemented");
    }     
}

Обычно эта ошибка возникает в следующих ситуациях:

  • Строка не заканчивается кавычками. Это легко изменить, просто заключите строку в указанные кавычки.
  • Строка превышает одну строку. Длинную строку можно разделить на несколько коротких строк и соединить знаком плюс («+»).
  • Кавычки, являющиеся частью строки, не экранируются обратной косой чертой («\»).

Прочтите эту статью:Сообщение об ошибке незакрытой строки。

3. “Illegal Start of an Expression”

Есть много причин для ошибки «Незаконное начало выражения». Это стало одним из наименее полезных сообщений об ошибках. Некоторые разработчики думают, что это вызвано плохим запахом кода.

Обычно выражение создается для генерации нового значения или присвоения значений другим переменным. Компилятор ожидает найти выражение, но посколькуГрамматика не оправдывает ожиданийВыражение не найдено. Эту ошибку можно найти в следующем коде.

} // добавляем сюда
       public void newShape(String shape) {
        switch (shape) {
            case "Line":
                Shape line = new Line(startX, startY, endX, endY);
            shapes.add(line);
            break;
                case "Oval":
            Shape oval = new Oval(startX, startY, endX, endY);
            shapes.add(oval);
            break;
            case "Rectangle":
            Shape rectangle = new Rectangle(startX, startY, endX, endY);
            shapes.add(rectangle);
            break;
            default:
            System.out.println("ERROR. Check logic.");
        }
        }
    } // удаляем отсюда
    }

Прочтите эту статью:Как устранить ошибки «неправильное начало выражения»。

4. “Cannot Find Symbol”

Это очень распространенная проблема, потому что все идентификаторы в Java должны быть объявлены до их использования. Эта ошибка возникает из-за того, что компилятор не понимает значения идентификатора при компиляции кода.

cannot-find-symbol-error-screenshot-11495

Сообщение об ошибке «Не удается найти символ» может иметь множество причин:

  • Написание объявления идентификатора может не соответствовать написанию, используемому в коде.
  • Переменная никогда не объявлялась.
  • Переменная не объявлена ​​в той же области видимости.
  • Никакие классы не импортируются.

Прочтите эту статью:Обсуждение ошибки «не удается найти символ»。

5. “Public Class XXX Should Be in File”

Если класс XXX и имя файла программы Java не совпадают, будет сгенерировано сообщение об ошибке «Открытый класс XXX должен быть в файле». Только когда имя класса и имя файла Java совпадают, код может быть скомпилирован.

package javaapplication3;  
  public class Robot {  
        int xlocation;  
        int ylocation;  
        String name;  
        static int ccount = 0;  
        public Robot(int xxlocation, int yylocation, String nname) {  
            xlocation = xxlocation;  
            ylocation = yylocation;  
            name = nname;  
            ccount++;         
        } 
  }
  public class JavaApplication1 { 
    public static void main(String[] args) {  
        robot firstRobot = new Robot(34,51,"yossi");  
        System.out.println("numebr of robots is now " + Robot.ccount);  
    }
  }

Чтобы решить эту проблему, вы можете:

  • Назовите класс и файл с тем же именем.
  • Убедитесь, что два имени всегда совпадают.

Прочтите эту статью:Примеры ошибки «Открытый класс XXX должен быть в файле»。

6. “Incompatible Types”

«Несовместимые типы» — это логические ошибки, которые возникают, когда операторы присваивания пытаются сопоставить типы переменных и выражений. Обычно эта ошибка возникает при присвоении строки целому числу и наоборот. Это не синтаксическая ошибка Java.

test.java:78: error: incompatible types
return stringBuilder.toString();
                             ^
required: int
found:    String
1 error

Когда компилятор выдает сообщение «несовместимые типы», решить эту проблему действительно непросто:

  • Используйте функции преобразования типов.
  • Разработчикам может потребоваться изменить исходные функции кода.

Взгляните на этот пример:Присвоение строки целому числу приведет к ошибке «несовместимые типы».。

7. “Invalid Method Declaration; Return Type Required”

Это сообщение об ошибке означает, что тип возвращаемого значения метода не объявлен явно в объявлении метода.

public class Circle
{
    private double radius;
    public CircleR(double r)
    {
        radius = r;
    }
    public diameter()
    {
       double d = radius * 2;
       return d;
    }
}

Есть несколько ситуаций, которые вызывают ошибку «недопустимое объявление метода; требуется тип возвращаемого значения»:

  • Забыл объявить тип.
  • Если метод не имеет возвращаемого значения, вам необходимо указать «void» в качестве возвращаемого типа в объявлении метода.
  • Конструктору не нужно объявлять тип. Однако, если в имени конструктора есть ошибка, компилятор будет рассматривать конструктор как метод без указанного типа.

Взгляните на этот пример:Проблема именования конструктора вызывает проблему «недопустимое объявление метода; требуется тип возвращаемого значения».。

8. “Method in Class Cannot Be Applied to Given Types”

Это сообщение об ошибке более полезно, оно означает, что метод был вызван с неправильными параметрами.

RandomNumbers.java:9: error: method generateNumbers in class RandomNumbers cannot be applied to given types;
generateNumbers();

required: int[]

found:generateNumbers();

reason: actual and formal argument lists differ in length

При вызове метода вы должны передать те параметры, которые определены в его объявлении. Пожалуйста, проверьте объявление метода и вызов метода, чтобы убедиться, что они совпадают.

Это обсуждение иллюстрируетОшибки Java, вызванные несовместимостью объявлений методов и параметров в вызовах методов。

9. “Missing Return Statement”

Когда в методе отсутствует оператор возврата, выдается сообщение об ошибке «Отсутствует оператор возврата». Метод с возвращаемым значением (тип, не являющийся недействительным) должен иметь оператор, который возвращает значение, чтобы значение можно было вызвать вне метода.

public String[] OpenFile() throws IOException {
    Map<String, Double> map = new HashMap();
    FileReader fr = new FileReader("money.txt");
    BufferedReader br = new BufferedReader(fr);
    try{
        while (br.ready()){
            String str = br.readLine();
            String[] list = str.split(" ");
            System.out.println(list);               
        }
    }   catch (IOException e){
        System.err.println("Error - IOException!");
    }
}

Есть несколько причин, по которым компилятор выдает сообщение «отсутствует оператор возврата»:

  • Оператор возврата был опущен по ошибке.
  • Метод не возвращает никакого значения, но тип не объявлен как недействительный в объявлении метода.

пожалуйста, проверьтеКак устранить ошибку «отсутствует отчет о возврате»Это пример.

10. “Possible Loss of Precision”

Когда информация, присвоенная переменной, превышает верхний предел, который может нести переменная, выдается ошибка «Возможная потеря точности». Как только это произойдет, часть информации будет отброшена. Если это не проблема, переменную следует явно объявить в коде как новый тип.

possible-loss-of-precision-error-11501

Ошибка «возможная потеря точности» обычно возникает в следующих ситуациях:

  • Попробуйте присвоить переменной целочисленного типа действительное число.
  • Попробуйте присвоить данные типа double переменной целочисленного типа.

Основные типы данных в JavaОбъясняет характеристики различных типов данных.

11. “Reached End of File While Parsing”

Это сообщение об ошибке обычно появляется, когда в программе отсутствует закрывающая фигурная скобка («}»). Иногда эту ошибку можно быстро исправить, добавив закрывающую скобку в конце кода.

public class mod_MyMod extends BaseMod
public String Version()
{
     return "1.2_02";
}
public void AddRecipes(CraftingManager recipes)
{
   recipes.addRecipe(new ItemStack(Item.diamond), new Object[] {
      "#", Character.valueOf('#'), Block.dirt
   });
}

Приведенный выше код приведет к следующей ошибке:

java:11: reached end of file while parsing }

Инструменты кодирования и правильные отступы кода могут упростить поиск этих несоответствующих фигурных скобок.

Прочтите эту статью:Отсутствие фигурных скобок вызовет сообщение об ошибке «достигнут конец файла при синтаксическом анализе».。

12. “Unreachable Statement”

Когда оператор появляется в месте, где он не может быть выполнен, выдается ошибка «Недоступный оператор». Обычно это делается после оператора break или return.

for(;;){
   break;
   ... // unreachable statement
}
int i=1;
if(i==1)
  ...
else
  ... // dead code

Обычно эту ошибку можно исправить, просто переместив оператор return. Прочтите эту статью:Как исправить ошибку «Недостижимый отчет»。

13. “Variable Might Not Have Been Initialized”

Если локальная переменная, объявленная в методе, не инициализирована, возникнет такая ошибка. Такая ошибка возникает, если вы включаете переменную без начального значения в оператор if.

int x;
if (condition) {
    x = 5;
}
System.out.println(x); // x не может быть инициализирован

Прочтите эту статью:Как избежать появления ошибки «Возможно, переменная не была инициализирована»。

14. “Operator … Cannot be Applied to ”

Эта проблема возникает, когда оператор действует с типом, который не входит в область его определения.

operator < cannot be applied to java.lang.Object,java.lang.Object

Эта ошибка часто возникает, когда код Java пытается использовать строковые типы в вычислениях (вычитание, умножение, сравнение размеров и т. Д.). Чтобы решить эту проблему, вам необходимо преобразовать строку в целое число или число с плавающей запятой.

Прочтите эту статью:Почему нечисловые типы вызывают ошибки программного обеспечения Java。

15. “Inconvertible Types”

Когда код Java пытается выполнить недопустимое преобразование, возникает ошибка «Неконвертируемые типы».

TypeInvocationConversionTest.java:12: inconvertible types
found   : java.util.ArrayList<java.lang.Class<? extends TypeInvocationConversionTest.Interface1>>
required: java.util.ArrayList<java.lang.Class<?>>
    lessRestrictiveClassList = (ArrayList<Class<?>>) classList;
                                                     ^

Например, логические типы нельзя преобразовать в целые числа.

Прочтите эту статью:Как преобразовывать неконвертируемые типы в программном обеспечении Java。

16. “Missing Return Value”

Если оператор возврата содержит неверный тип, вы получите сообщение «Отсутствует возвращаемое значение». Например, посмотрите на следующий код:

public class SavingsAcc2 {
    private double balance;
    private double interest;
    public SavingsAcc2() {
        balance = 0.0;
        interest = 6.17;
    }
    public SavingsAcc2(double initBalance, double interested) {
        balance = initBalance;
        interest = interested;
    }
    public SavingsAcc2 deposit(double amount) {
        balance = balance + amount;
        return;
    }
    public SavingsAcc2 withdraw(double amount) {
        balance = balance - amount;
        return;
    }
    public SavingsAcc2 addInterest(double interest) {
        balance = balance * (interest / 100) + balance;
        return;
    }
    public double getBalance() {
        return balance;
    }
}

Возвращается следующая ошибка:

SavingsAcc2.java:29: missing return value 
return; 
^ 
SavingsAcc2.java:35: missing return value 
return; 
^ 
SavingsAcc2.java:41: missing return value 
return; 
^ 
3 errors

Обычно эта ошибка возникает из-за того, что оператор return ничего не возвращает.

Прочтите эту статью:Как избежать ошибки «Отсутствует возвращаемое значение»。

17. “Cannot Return a Value From Method Whose Result Type Is Void”

Эта ошибка Java возникает, когда метод void пытается вернуть какое-либо значение, например, в следующем коде:

public static void move()
{
    System.out.println("What do you want to do?");
    Scanner scan = new Scanner(System.in);
    int userMove = scan.nextInt();
    return userMove;
}
public static void usersMove(String playerName, int gesture)
{
    int userMove = move();
    if (userMove == -1)
    {
        break;
    }

Обычно эту проблему может решить изменение типа возвращаемого значения метода, чтобы он соответствовал типу в операторе возврата. Например, следующий void можно изменить на int:

public static int move()
{
    System.out.println("What do you want to do?");
    Scanner scan = new Scanner(System.in);
    int userMove = scan.nextInt();
    return userMove;
}

Прочтите эту статью:Как исправить ошибку «Невозможно вернуть значение из метода, тип результата которого недействителен»。

18. “Non-Static Variable … Cannot Be Referenced From a Static Context”

Эта ошибка возникает, когда компилятор пытается получить доступ к нестатической переменной в статическом методе:

public class StaticTest {
    private int count=0;
    public static void main(String args[]) throws IOException {
        count++; //compiler error: non-static variable count cannot be referenced from a static context
    }
}

Чтобы устранить ошибку «Нестатическая переменная… На нее нельзя ссылаться из статического контекста», можно сделать две вещи:

  • Вы можете объявить переменные статическими.
  • Вы можете создавать экземпляры нестатических объектов в статических методах.

Пожалуйста, прочтите это руководство:Разница между статическими и нестатическими переменными。

19. “Non-Static Method … Cannot Be Referenced From a Static Context”

Эта проблема возникает, когда код Java пытается вызвать нестатический метод в статическом классе. Например, такой код:

class Sample
{
   private int age;
   public void setAge(int a)
   {
      age=a;
   }
   public int getAge()
   {
      return age;
   }
   public static void main(String args[])
   {
       System.out.println("Age is:"+ getAge());
   }
}

Вызовет эту ошибку:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
Cannot make a static reference to the non-static method getAge() from the type Sample

Чтобы вызвать нестатический метод в статическом методе, необходимо объявить экземпляр класса вызываемого нестатического метода.

Прочтите эту статью:Разница между нестатическими и статическими методами。

20. “(array) Not Initialized”

Если массив был объявлен, но не инициализирован, вы получите сообщение об ошибке типа «(массив) не инициализирован». Длина массива фиксирована, поэтому каждый массив необходимо инициализировать требуемой длиной.

Следующий код правильный:

AClass[] array = {object1, object2}

это тоже нормально:

AClass[] array = new AClass[2];
...
array[0] = object1;
array[1] = object2;

Но это не так:

AClass[] array;
...
array = {object1, object2};

Прочтите эту статью:О том, как инициализировать массив в Java。

Продолжение следует

Сегодня мы обсуждали ошибки компилятора, в следующий раз мы обсудим различные исключения времени выполнения, которые могут возникнуть. Как и структура этой статьи, в следующий раз она будет содержать фрагменты кода, пояснения и ссылки по теме, которые помогут вам исправить код как можно скорее.

In this post, I will be sharing how to fix unclosed string literal error in Java. As the name suggests, this error occurs when the string literal ends without quotation marks. A String class object should be enclosed in double-quotes in Java, in case you miss them you will get this error. Unclosed String Literal error is a compile-time error. As always, first, we will produce the unclosed string literal error before moving on to the solution.

Read Also: Print quotation marks in the java

[Fixed] Unclosed String Literal Error

Example 1: Producing the error by having string literal that does not end with quotes

We can easily produce this error by using a string literal that does not end with quotes as shown below:

 public class UnclosedStringLiteral {
    public static void main(String args[]) {
        String str = "Love Yourself;
        System.out.println(str);
    }
}

Output:
UnclosedStringLiteral.java:3: error: unclosed string literal
               String str = «Love Yourself;
                                    ^

1 error

Explanation:

The cause of this error is due to the missing end quotes of string literal as shown above.

Solution:

The above compilation error can be resolved by providing the end quotes of string literal as shown below:

 public class UnclosedStringLiteral {
    public static void main(String args[]) {
        String str = "Love Yourself";
        System.out.println(str);
    }
}

Output:
Love Yourself

Example 2: Producing the error when string literal extends beyond a line

We can easily produce this error when string literal extends beyond a line i.e multiline string as shown below:

 public class UnclosedStringLiteral2 {
    public static void main(String args[]) {
        String str = "Be in Present
                        +   Alive is Awesome";
        System.out.println(str);
    }
}

Output:
UnclosedStringLiteral2.java:3: error: unclosed string literal
               String str = «Be in Present
                                   ^
UnclosedStringLiteral2.java:4: error: ‘;’ expected
                                          + Alive is Awesome»;
                                                         ^
UnclosedStringLiteral2.java:4: error: unclosed string literal
                                          + Alive is Awesome»;
                                                                          ^
UnclosedStringLiteral2.java:4: error: not a statement
                                          + Alive is Awesome»;
                                                           ^
4 errors

Explanation:

The cause of this error is due to the missing end and start quotes of the multiline string literal separated by + operator as shown above.

Solution:

The above compilation error can be resolved by providing the end and start quotes of multiline string literal separated by + operator as shown below:

 public class UnclosedStringLiteral2 {
    public static void main(String args[]) {
        String str = "Be in Present"
                        +   "Alive is Awesome";
        System.out.println(str);
    }
}

Output:
Be in PresentAlive is Awesome

Example 3: Producing the error when the part of the string literal is not escaped with a backslash(«\»)

We can easily produce this error when the part of the string literal is not escaped with a backslash(«\») as shown below:

 public class UnclosedStringLiteral3 {
    public static void main(String args[]) {
        String str = "Alive is Awesome, "+"\" + "Be in Present, " + "Love Yourself" ;
        System.out.println(str);
    }
}

Output:
UnclosedStringLiteral3.java:3: error: ‘;’ expected
               String str = «Alive is Awesome, «+»\» + «Be in Present, » + «Love Yourself» ;
                                                                                     ^
UnclosedStringLiteral3.java:3: error: ‘;’ expected
               String str = «Alive is Awesome, «+»\» + «Be in Present, » + «Love Yourself» ;
                                                                                             ^
UnclosedStringLiteral3.java:3: error: not a statement
               String str = «Alive is Awesome, «+»\» + «Be in Present, » + «Love Yourself» ;
                                                                                              ^
UnclosedStringLiteral3.java:3: error: ‘;’ expected
               String str = «Alive is Awesome, «+»\» + «Be in Present, » + «Love Yourself» ;
                                                                                                           ^
UnclosedStringLiteral3.java:3: error: unclosed string literal
               String str = «Alive is Awesome, «+»\» + «Be in Present, » + «Love Yourself» ;
                                                                                                                                             ^
5 errors

Explanation:

The cause of this error is due to the part of the string literal is not escaped with («\») backslash character as shown above.

Solution:

The above compilation error can be resolved by escaping the backslash character as shown below:

 public class UnclosedStringLiteral3 {
    public static void main(String args[]) {
        String str = "Alive is Awesome, "+"\\" + "Be in Present, " + "Love Yourself" ;
        System.out.println(str);
    }
}

Output:
Alive is Awesome, \Be in Present, Love Yourself

That’s all for today, please mention in the comments in case you are still facing the error unclosed string literal error in Java.

Время на прочтение
9 мин

Количество просмотров 15K

Тайна ошибки комментария и другие истории…

Вступление

Знаете ли вы, что следующее является допустимым выражением Java?

\u0069\u006E\u0074 \u0069 \u003D \u0038\u003B

Вы можете попробовать скопировать и вставить его в основной метод любого класса и скомпилировать. Если вы затем добавите следующий оператор

System.out.println(i);

и после компиляции запустите этот класс, код напечатает число 8!

А знаете ли вы, что этот комментарий вместо этого вызывает синтаксическую ошибку во время компиляции?

/*
 * The file will be generated inside the C:\users\claudio folder
 */

Тем не менее, комментарии не должны приводить к синтаксическим ошибкам. Фактически, программисты часто комментируют фрагменты кода, чтобы компилятор их игнорировал… так что же происходит?

Для того, чтобы узнать почему это происходит, потратьте несколько минут на небольшой обзор основ Java о примитивном типе char.

Примитивный тип данных char

Как всем известно, char это один из восьми примитивных типов Java. Это позволяет нам хранить по одному символу. Ниже приведен простой пример, в котором значение символа присваивается типу char:

char aCharacter = 'a';

На самом деле этот тип данных используется нечасто, потому что в большинстве случаев программистам нужны последовательности символов и поэтому они предпочитают строки. Каждое буквальное значение символа должно быть заключено между двумя одинарными кавычками, чтобы не путать с двойными кавычками, используемыми для строковых литералов. Объявление строки:

String s = "Java melius semper quam latinam linguam est";

Есть три способа присвоить литералу значение типа char, и все три требуют включения значения в одинарные кавычки:

  • используя один печатный символ на клавиатуре (например '&').

  • используя формат Unicode с шестнадцатеричной нотацией (например, '\u0061', который эквивалентен десятичному числу 97 и идентифицирует символ 'a').

  • используя специальный escape-символ (например, '\n' который указывает символ перевода строки).

Давайте добавим некоторые детали в следующих трех разделах.

Печатаемые символы клавиатуры

Мы можем назначить любой символ, найденный на нашей клавиатуре, char переменной, при условии, что наши системные настройки поддерживают требуемый символ и что этот символ доступен для печати (например, клавиши «Canc» и «Enter» не печатаются). 

Скорее всего речь идет о «Esc» — комментарий vesper-bot.

В любом случае литерал, присваиваемый примитивному типу char, всегда заключен между двумя одинарными кавычками. Вот некоторые примеры:

char aUppercase = 'A';
char minus = '-';
char at = '@';

Тип данных charхранится в 2 байтах (16 бит), а диапазон состоит только из положительных чисел от 0 до 65 535. Фактически, существует «отображение», которое связывает определенный символ с каждым числом. Это отображение (или кодирование) определяется стандартом Unicode (более подробно описанным в следующем разделе).

Формат Unicode (шестнадцатеричное представление)

Мы сказали, что примитивный тип char хранится в 16 битах и ​​может определять до 65 536 различных символов. Кодирование Unicode занимается стандартизацией всех символов (а также символов, смайликов, идеограмм и т. д.), существующих на этой планете. Unicode — это расширение кодировки, известной как UTF-8, которая, в свою очередь, основана на старом 8-битном расширенном стандарте ASCII, который, в свою очередь, содержит самый старый стандарт, ASCII code (аббревиатура от American Standard Code for Information Interchange).

Мы можем напрямую присвоить Unicode char значение в шестнадцатеричном формате, используя 4 цифры, которые однозначно идентифицируют данный символ, добавляя к нему префикс \u (всегда в нижнем регистре). Например:

char phiCharacter = '\u03A6';  // Capital Greek letter Φ
char nonIdentifiedUnicodeCharacter = '\uABC8';

В данном случае мы говорим о литерале в формате Unicode (или литерале в шестнадцатеричном формате). Фактически, при использовании 4 цифр в шестнадцатеричном формате охватывается ровно 65 536 символов.

Java 15 поддерживает Unicode версии 13.0, которая содержит намного больше символов, чем 65 536 символов. Сегодня стандарт Unicode сильно изменился и теперь позволяет нам представлять потенциально более миллиона символов, хотя уже присвоено только 143 859 чисел конкретным символам. Но стандарт  постоянно развивается.  В любом случае, для присвоения значений Unicode, выходящих за пределы 16-битного диапазона типа char, мы обычно используем классы вроде  String и  Character, но поскольку это очень редкий случай и не интересен для целей этой статьи, мы не будем об этом говорить.

Специальные escape-символы

В char типе также можно хранить специальные escape-символы, то есть последовательности символов, которые вызывают определенное поведение при печати:

  • \b эквивалентно backspace, отмене слева (эквивалентно клавише Delete).

  • \n эквивалентно переводу строки (эквивалентно клавише Ente).

  • \\ равняется только одному \ (только потому, что символ \ используется для escape-символов).

  • \t эквивалентно горизонтальной табуляции (эквивалентно клавише TAB).

  • \'  эквивалентно одинарной кавычке (одинарная кавычка ограничивает литерал символа).

  • \"  эквивалентно двойной кавычке (двойная кавычка ограничивает литерал строки).

  • \r представляет собой возврат каретки (специальный символ, который перемещает курсор в начало строки).

  • \f представляет собой подачу страницы (неиспользуемый специальный символ, представляющий курсор, перемещающийся на следующую страницу документа).

Обратите внимание, что присвоение литерала '"' символу совершенно законно, поэтому следующий оператор:

System.out.println('"');

что эквивалентно следующему коду:

char doubleQuotes = '"';
System.out.println(doubleQuotes);

правильно и напечатает символ двойной кавычки:

"

Если бы мы попытались не использовать escape-символ для одиночных кавычек, например, со следующим утверждением:

System.out.println(''');

мы получим следующие ошибки времени компиляции, поскольку компилятор не сможет различить разделители символов:

error: empty character literal
        System.out.println(''');
                           ^
error: unclosed character literal
        System.out.println(''');
                             ^
2 errors

Поскольку разделители строковых литералов представлены в двойных кавычках, ситуация обратная. Фактически, внутри строки можно заключить одинарные кавычки:

System.out.println("'IQ'");

который напечатает:

'IQ'

С другой стороны, мы должны использовать \" escape-символ, чтобы использовать двойные кавычки в строке. Итак, следующее утверждение:

System.out.println(""IQ"");

вызовет следующие ошибки компиляции:

error: ')' expected
        System.out.println(""IQ"");
                             ^
error: ';' expected
        System.out.println(""IQ"");
                               ^
2 errors

Вместо этого верна следующая инструкция:

System.out.println("\"IQ\"");

и напечатает:

"IQ"

Написание Java кода в формате Unicode

Литеральный формат Unicode также можно использовать для замены любой строки нашего кода. Фактически, компилятор сначала преобразует формат Unicode в символ, а затем оценивает синтаксис. Например, мы могли бы переписать следующий оператор:

int i = 8;

следующим образом:

\u0069\u006E\u0074 \u0069 \u003D \u0038\u003B

Фактически, если мы добавим к предыдущей строке следующий оператор:

System.out.println("i = " + i);

он напечатает:

i = 8

Несомненно, это бесполезный способ написания нашего кода. Но может быть полезно знать эту функцию, поскольку она позволяет нам понять некоторые ошибки, которые (редко) случаются.

Формат Unicode для escape-символов

Тот факт, что компилятор преобразует шестнадцатеричный формат Unicode перед оценкой кода, имеет некоторые последствия и оправдывает существование escape-символов. Например, давайте рассмотрим символ перевода строки, который можно представить с помощью escape-символа \n. Теоретически перевод строки связан в кодировке Unicode с десятичным числом 10 (что соответствует шестнадцатеричному числу A). Но, если мы попытаемся определить его в формате Unicode:

char lineFeed = '\u000A';

мы получим следующую ошибку времени компиляции:

error: illegal line end in character literal
        char lineFeed = '\u000A'; 
                        ^
1 error

В реальности, компилятор преобразует предыдущий код в следующий перед его оценкой:

char lineFeed = '
';

Формат Unicode был преобразован в символ новой строки, и предыдущий синтаксис не является допустимым синтаксисом для компилятора Java.

Аналогично, символ одинарной кавычки ', который соответствует десятичному числу 39 (эквивалентно шестнадцатеричному числу 27) и который мы можем представить с помощью escape-символа \’, не может быть представлен в формате Unicode:

char singleQuote = '\u0027';

Также в этом случае компилятор преобразует предыдущий код следующим образом:

char singleQuote = ''';

что приведет к следующим ошибкам времени компиляции:

error: empty character literal

        char singleQuote = '\u0027';
                    ^

error: unclosed character literal

        char singleQuote = '\u0027';
                           ^
2 errors

Первая ошибка связана с тем, что первая пара кавычек не содержит символа, а вторая ошибка указывает на то, что указание третьей одинарной кавычки является незакрытым символьным литералом.

Также есть проблемы с символом возврата каретки, представленным шестнадцатеричным числом D (соответствующим десятичному числу 13) и уже представленным с помощью escape-символа \r. Фактически, если мы напишем:

char carriageReturn = '\u000d';

мы получим следующую ошибку времени компиляции:

error: illegal line end in character literal

char carriageReturn = '\u000d';
                      ^
1 error

Фактически, компилятор преобразовал число в формате Unicode в возврат каретки, вернув курсор в начало строки, и то, что должно было быть второй одинарной кавычкой, стало первой.

Что касается символа ,, представленного десятичным числом 92 (соответствующего шестнадцатеричному числу 5C) и представленного escape-символом \, если мы напишем:

char backSlash = '\u005C';

мы получим следующую ошибку времени компиляции:

error: unclosed character literal
        char backSlash = '\u005C'; 
                         ^  
1 error

Это потому, что предыдущий код будет преобразован в следующий:

char backSlash = '\';

и поэтому пара символов ' рассматривается как escape-символ, соответствующий одинарной кавычке, и поэтому в буквальном закрытии отсутствует другая одинарная кавычка.

С другой стороны, если мы рассмотрим символ ", представленный шестнадцатеричным числом 22 (соответствующий десятичному числу 34) и представленный escape-символом ", если мы напишем:

char quotationMark = '\u0022';

проблем не будет. Но если мы используем этот символ внутри строки:

String quotationMarkString = "\u0022";

мы получим следующую ошибку времени компиляции:

error: unclosed string literal

   String quotationMarkString = "\u0022";
                                       ^

1 error  

поскольку предыдущий код будет преобразован в следующий:

String quotationMarkString = """;

Тайна ошибки комментария

Еще более странная ситуация возникает при использовании однострочных комментариев для форматов Unicode, таких как возврат каретки или перевод строки. Например, несмотря на то, что оба следующих оператора закомментированы, могут возникнуть ошибки во время компиляции!

// char lineFeed = '\u000A';  
// char carriageReturn = '\u000d'; 

Это связано с тем, что компилятор всегда преобразует шестнадцатеричные форматы с помощью символов перевода строки и возврата каретки, которые несовместимы с однострочными комментариями; они печатают символы вне комментария! 

Чтобы разрешить ситуацию, используйте обозначение многострочного комментария, например:

/* char lineFeed = '\u000A';  
   char carriageReturn = '\u000d'; */

Другая ошибка, из-за которой программист может потерять много времени, — это использование последовательности \u в комментарии. Например, со следующим комментарием мы получим ошибку времени компиляции:

/*
 * The file will be generated inside the C:\users\claudio folder
 */

Если компилятор не находит допустимую последовательность из 4 шестнадцатеричных символов после \u, он выведет следующую ошибку:

error: illegal unicode escape

* The file will be generated inside the C:\users\claudio folder
                                             ^
1 error

Выводы

В этой статье мы увидели, что использование типа charв Java скрывает некоторые действительно удивительные особые случаи. В частности, мы увидели, что можно писать код Java, используя формат Unicode. Это связано с тем, что компилятор сначала преобразует формат Unicode в символ, а затем оценивает синтаксис. Это означает, что программисты могут находить синтаксические ошибки там, где они никогда не ожидали, особенно в комментариях.

Примечание автора: эта статья представляет собой короткий отрывок из раздела 3.3.5 «Примитивные символьные типы данных» тома 1 моей книги «Java для пришельцев». Для получения дополнительной информации посетите сайт книги (вы можете загрузить раздел 3.3.5 из области «Примеры»).

In my program, there is a string that contains double quotes and less than and greater than symbols. Here is a sample String:

String s2="div class=\"codeblock\"><pre name=\"code\" class=\"java\" ";

Can anyone help me?

  • java
  • string

Aditya W's user avatar

Aditya W

6528 silver badges20 bronze badges

asked Feb 5, 2013 at 14:22

Sonoo Jaiswal's user avatar

Sonoo JaiswalSonoo Jaiswal

2551 gold badge4 silver badges12 bronze badges

5

  • You need to escape the double quotes:"some string with \"double quotes\" in the middle".

    Feb 5, 2013 at 14:22

  • "\"" (please do your research before posting here)

    Feb 5, 2013 at 14:23

  • I have replaced all the double quotes by \» but it gives error!

    Feb 5, 2013 at 14:25

  • Source code is String s2=»div class=\»codeblock\»><pre name=\»code\» class=\»java\» «;

    Feb 5, 2013 at 14:25

  • @Sonno Jaiswal—— Edit your post and paste your source code there and not in comments.

    Feb 5, 2013 at 14:29

2 Answers

Escaping «\» is the answer. Alternatively as lots of escaping required in xml (html can also be treated as xml), it would be a good idea to have a separate file and read the string from the file.

answered Feb 5, 2013 at 14:31

wizardfan's user avatar

wizardfanwizardfan

1761 silver badge7 bronze badges

Thanks Everyone, I finally find out the solutions, I copied the double quotes from the html file, so there was the problem. When I changed the double quote in java file, it compiled successfully.

answered Feb 6, 2013 at 6:52

Sonoo Jaiswal's user avatar

Sonoo JaiswalSonoo Jaiswal

2551 gold badge4 silver badges12 bronze badges

1

  • Thats why I said it compiles successfully

    Feb 6, 2013 at 14:11

Понравилась статья? Поделить с друзьями:
  • Uncaught in promise ошибка 403
  • Uncaught in promise ошибка 400
  • Uncar dll вернул код ошибки
  • Unb ошибка на стиральной машине hisense
  • Ultraiso ошибка дисковод не найден