2017-01-16 2 views
-4

Я получаю эту проблему компиляции, и я не могу понять, почему. Может кто-нибудь помочь?Почему этот фрагмент кода показывает ошибку компиляции?

public static void main(String[] args) { 

    Scanner scan = new Scanner(System.in); 
    int n = scan.getInt() ; 
    System.out.println(factorial(n)) ; 


int factorial(int a){ 
     if (a==0) 
      return 1; 
     else 
      return (a*factorial(a-1)); 
    }} 

сообщение Редактировать Примечание: Я не был осведомлен о том, что другая функция не может быть объявлена ​​внутри основной(). При написании этого снаружи он работал нормально.

+2

Отсутствует '' 'после строки' System.out.println'. И есть один '}' слишком много в конце. –

+0

Вы забыли закрыть свой метод 'main()' с помощью скобки '}'. Скорее всего, вы вставили 'factorial' внутри' main'. –

+0

Да, осознал ошибку. Я не знал, что другая функция не может быть объявлена ​​внутри main(). Благодарим вас за помощь. –

ответ

6

Вы пытаетесь создать метод factorialвнутри ваш метод main. Он должен быть рядом с ним, а не внутри него.

Форматирование кода читаемо и последовательно помогает сделать проблему разъясняя:

import java.io.*; 
import java.util.*; 
import java.text.*; 
import java.math.*; 
import java.util.regex.*; 

public class Solution { 

    public static void main(String[] args) { 

     Scanner scan = new Scanner(System.in); 
     int n = scan.getInt(); 
     System.out.println(factorial(n)); 

     int factorial(int a) {     // <=== Problem 
      if (a == 0) 
       return 0; 
      else 
       return (a * factorial(a - 1)); 
     } 
    } 
} 

Вместо:

import java.io.*; 
import java.util.*; 
import java.text.*; 
import java.math.*; 
import java.util.regex.*; 

public class Solution { 

    public static void main(String[] args) { 

     Scanner scan = new Scanner(System.in); 
     int n = scan.getInt(); 
     System.out.println(factorial(n)); 
    } 

    int factorial(int a) { 
     if (a == 0) 
      return 0; 
     else 
      return (a * factorial(a - 1)); 
    } 
} 

выше по-прежнему имеет проблемы (factorial должна быть static, или вам нужно создать экземпляр, чтобы вызвать его), но сейчас он находится в правильном месте.

+0

Спасибо, похоже, сейчас. Из любопытства, почему вы не можете определить другую функцию внутри main()? –

+0

@AmbareeshSJ: Это не так, как разрабатывается Java. У вас может быть лямбда или экземпляр анонимного класса, оба из которых работают немного как вложенный метод, но вы не можете определить фактический вложенный метод. –

+0

Можете ли вы объяснить статическую часть? Почему создание факториала статично заставляет его работать, а не иначе. Это похоже на статические переменные (где переменная типа помнит предыдущее значение, а затем продолжается?) –

Смежные вопросы