جاوا یک زبان برنامهنویسی شیگرا است که با استفاده از آن میتوان برنامههای کاربردی کوچک و بزرگ تحت دسکتاپ، تحت وب و همچنین اپلیکیشنهای موبایل ایجاد کرد. کاربردهای گسترده زبان جاوا و همچنین ویژگیهایی مانند امنیت بالا و قابل حمل بودن کدهای نوشته شده به این زبان، برنامهنویسان زیادی را در سراسر دنیا به خود جذب کرده است. زبان جاوا شباهت زیادی به زبانهای C و ++C داشته و از قواعد یکنواختی که در تمامی دستورات آن استفاده میشود. کدنویسی آسان و قواعد کدنویسی صریح جاوا نیز یکی از دلایلی است که پیشنهاد میشود افراد تازهکار، برنامهنویسی را با این زبان شروع کنند.
خطاهای رایج برنامهنویسی زبان جاوا:
هنگام توسعه نرمافزار به زبان جاوا ممکن است با انواع بسیاری از خطاها مواجه شوید که بیشتر آنها اجتنابپذیر هستند. در واقع خطاها بخش جداناشدنی از توسعه نرمافزار هستند و شناخت خطاها و روش حل آنها برای برنامهنویسان ضروریست. در این مقاله 15 مورد از متداولترین خطاهای رایج در جاوا به همراه مثال و راه حلهای مختلف گردآوری شده است.
Expected...
این خطا زمانی رخ میدهد که قسمتی از کد وجود نداشته باشد. برای مثال زمانی که گذاشتن یک ";" یا پرانتز را فراموش میکنید، این خطا رخ میدهد.
معمولا این پیغام خطا به مکان دقیقی که در آن خطا رخ داده است اشاره نمیکند. روشهای یافتن مکان دقیق خطا:
اطمینان حاصل کنید که تمامی پرانتزهای باز، بسته شده هستند.
به خط قبلی مکانی که کامپایلر نشان میدهد در آن خطا رخ داده نگاه کنید. کامپایلر تا زمانی که کدهای بیشتری مشاهده نکند متوجه این خطای نرمافزاری نمیشود.
گاهی اوقات کاراکترهایی مانند پرانتز باز نباید در جایگاه شروع قرار گیرند، پس برنامهنویس برای ایجاد تعادل در پرانتزها، آن را نمیبندد.
در این کد 2 خطا وجود دارد. که به صورت زیر برطرف میشوند:
if (solidom.equalsIgnoreCase("esfera") => if (solidom.equalsIgnoreCase("esfera"))
و
if (solidom.equalsIgnoreCase("cilindro") => if (solidom.equalsIgnoreCase("cilindro"))
Unclosed String Literal
پیغام خطای "Unclosed String Literal" زمانی نمایش داده میشود که انتهای یک string علامت کوتیشن وجود نداشته باشد. این خطای لفظی دقیقا به همان خطی که خطا در آن رخ داده است اشاره میکند.
نکته: در صورتی که یک رشته از اجزای مختلفی تشکیل شده باشد که توسط علامت "+" به هم متصل شده و رشته را تشکیل دهند، ممکن است گذاشتن کوتیشن بین آنها فراموش شود.
نکته: در کنار کوتیشنهایی که بخشی از string هستند باید از "\" استفاده کرد.
مثال:
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");
}
}
نمونه این خطا در خط 33 یافت میشود.
Illegal Start of an Expression
دلایل زیادی برای بروز خطای Illegal Start of an Expression وجود دارد. اگرچه عنوان این پیغام خطا کمک زیادی به رفع آن نمیکند؛ برخی از برنامهنویسان معتقدند که علت آن کدنویسی بد است.
زمانی که برای تعریف یک مقدار جدید یا اختصاص یک مقدار به متغیر از یک عبارت استفاده میکنیم، ممکن است کامپایلر به دلیل پیدا نکردن سینتکس مورد انتظارش آن مقدار را شناسایی نکند و این خطا رخ دهد.
مثال:
public class Main{
public static void main(String[] args) {
count();
public static int count(){
return 0;
}
}
این خطا، خطایی بسیار متداول در بین دانشجویان مبتدی است. تمامی شناسهها در جاوا میبایست قبل از استفاده تعریف شوند زیرا کامپایلر هنگام کامپایل کردن کد نمیتواند شناسهها را تشخیص دهد.
دلایلی که میتوانند باعث دریافت پیغام خطای Cannot Find Symbol شوند:
املای اشتباه شناسه که موجب عدم تطبیق آن با شناسهی تعریف شده میشود.
عدم تعریف شناسه پیش از استفاده
استفاده از متغیر در خارج از حوزهای که تعریف شده است.
ایمپورت نکردن کلاسی که شناسه در آن تعریف شده است.
مثال:
public class Test {
public static void main(String[] args) {
int a = 2;
int b = 4;
sum = (a + b );
System.out.println(sum);
}
}
Public Class XXX Should Be in File
این خطا زمانی رخ میدهد که کلاس XXX و نام فایل برنامه جاوا مطابقت نداشته باشند. کد شما فقط در صورت یکسان بودن نام کلاس و پرونده جاوا کامپایل میشود.
مثال:
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);
}
}
روشهای رفع این خطا:
برای کلاس و فایل نام یکسان انتخاب کنید.
به خاطر داشته باشید نام انتخاب شده را در آینده تغییر ندهید.
Incompatible Types
خطای "انواع ناسازگار" خطایی منطقی است که هنگامی رخ میدهد که به یک متغیر مقداری نامتناسب با نوع آن داده شود.
برای مثال:
import java.util.*;
import java.io.*;
public class Main {
public static int CheckNums(int num1, int num2) {
String answer = "";
if (num1 == num2) {
return -1;
}
else if (num2 > num1) {
answer = "false";
return answer;
}
else {
answer = "true";
return answer;
}
}
}
برای پیشگیری از بروز این نوع خطا هنگام نوشتن برنامه اطمینان حاصل کنید که مقادیر متناسب با نوع داده متغیرها را در آنها ذخیره میکنید.
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" تعریف کنید.
Constructor یا سازنده نیازی به تعیین نوع بازگشتی ندارد. اما اگر خطایی در نام سازنده وجود داشته باشد، کامپایلر با سازنده مانند متدی که نوع بازگشتی آن به درستی تعریف نشده، رفتار میکند.
(array) Not Initialized
این خطا زمانی رخ میدهد که آرایه تعریف شده ولی به درستی مقداردهی نشده باشد.
مثال:
public class Test1 {
public static void main(String[] args) {
int ia1[] = { 1, 2, {1,2}};
int ia2[] = ia1.clone();
System.out.print((ia1 == ia2) + " ");
ia1[1]++;
System.out.println(ia2[1]);
}
}
Non-Static Method ... Cannot Be Referenced From a Static Context
این خطا زمانی رخ میدهد که یک متد غیر استاتیک در یک متد استاتیک فراخوانی میشود.
برای مثال این خطا برای نمونه کد زیر رخ میدهد:
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());
}
}
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
برای پیشگیری از این نوع خطا، از یکسان بودن پارامترهای استفاده شده در متد با پارامترهای مورد نیاز آن که در کنار نام تابع تعریف شدهاند اطمینان حاصل کنید.
Unreachable Statement
این خطا زمانی رخ میدهد که یک عبارت در جایی نوشته شود که نتواند اجرا شود. برای مثال این خطا زمانی که عبارت بعد از break یا return نوشته شود، رخ میدهد.
مثال:
public class JavaCodeGeeks
{
public static void main(String[] args) {
while(true)
{
System.out.println("Hi");
}
System.out.println("Hello");
}
}
NoClassDefFoundError
این خطا نشان میدهد که تعریف کلاس در هنگام تهیه برنامه پیدا شده است، اما کلاس برنامه در هنگام اجرا در دسترس نیست. علت دیگر بروز این خطا عدم تعریف Main است.
مثال:
public class Test {
public Test() {
System.out.println("A new instance of the Test class was created!");
}
}
روشهای رفع این خطا:
قرار دادن فایل در دایرکتوری صحیح
اطمینان از هم نام بودن نام کلاس و فایل (حساس به بزرگ و کوچک بودن حروف)
Cannot Return a Value From Method Whose Result Type Is Void
این خطا زمانی رخ میدهد که از متدی که نمیتواند مقداری برگرداند، بخواهیم یک مقدار را return کند. این خطا معمولا با تغییر نوع تابع از void به int برطرف میشود.
مثال:
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;
}
Missing Return Value
این خطا زمانی رخ میدهد که مقدار بازگشتی تابع، اشتباه بوده یا وجود نداشته باشد.
مثال: کد زیر دارای 3 خطای Missing Return Value میباشد.
این پیغام یک خطای زمان اجراست که زمانی رخ میدهد که قسمتی از کد سعی میکند به مقادیری از آرایه دسترسی پیدا کند که وجود ندارند.
مثال:
public class ArrayIndexOutOfBoundException {
public static void main(String[] args) {
String[] arr = {"Rohit","Shikar","Virat","Dhoni"};
//Declaring 4 elements in the String array
for(int i=0;i<=arr.length;i++) {
//Here, no element is present at the iteration number arr.length, i.e 4
System.out.println(arr[i]);
//So it will throw ArrayIndexOutOfBoundException at iteration 4
}
}
}
در این مثال با تغییر => به > خطا برطرف خواهد شد.
نتیجهگیری
همانطور که پیشتر نیز گفته شد، در برنامهنویسی جاوا از قواعد مشخصی برای تعریف دقیق دستورات، متغیرها، کلاسها و... استفاده میشود. با شناخت و رعایت این قواعد به سادگی میتوان از بروز بسیاری از خطاها جلوگیری کرد. یادگیری این قواعد تنها با تمرین زیاد حاصل میشود و اگر تازهکار هستید ممکن است در ابتدای کدنویسی با خطاهای زیادی مواجه شوید که البته به مرور زمان با تکرار و تمرین بیشتر، تعداد این خطاها کاهش مییابد. تجربه شما از برنامهنویسی با زبان جاوا چیست؟ آیا خطایابی و رفع خطا در زبان جاوا برای شما آسانتر بوده است یا سایر زبانهای برنامهنویسی؟ نظرات خود را با ما به اشتراک بگذارید.
۲ دیدگاه
۱۲ مرداد ۱۴۰۱، ۰۸:۴۶
توضیحاتتون کامل و جامع و و من اموزشاتون واقعا لذت میبرم فقطاینکه چند روزه تو اندروید استودیو با اروری مواجه شدم نمیتونم مشکلمو حلش کنم میشه لطفا راهنماییم کنید.
نازنین کریمی مقدم۱۲ مرداد ۱۴۰۱، ۱۱:۰۳
درود
متن خطایی که میگیرید رو بفرستید تا بتونم کمک تون کنم.