请问我这个方法写的哪里有问题

请问我这个方法写的哪里有问题

程序总报错提示这个方法必须返回一个Map类型的。我在函数末尾有return啊

package utils;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import foodInfo.FoodInfo;

public class UploadUtils {
 
 public static Map<String, Object> UploadFile(HttpServletRequest request, String uploadDirectory) throws  IOException, FileUploadException{

     try{
      // 定义一个Map,用来存放添加页面中用户输入的所有控件对应的值
     Map<String ,Object> map = new HashMap<String,Object>();
     // 1.创建一个磁盘文件项工厂对象
     DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
     // 2.创建一个核心解析类
     ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
     // 3.解析request请求,返回的是List集合,List集合中存放的是FileItem对象
     List<FileItem> list = servletFileUpload.parseRequest(request);
     //定义一个集合,用来存放口味数据
     List<String> taste=new ArrayList<String>();
     String url=null;
     //遍历FileItem集合,判断是表单项还是文件上传项
     for(FileItem fileItem:list)
     {
      if(fileItem.isFormField())
      {
       //普通表单项
       //接收表单项对应的值
       String name=fileItem.getFieldName();//获得表单项name的属性值
       String value=fileItem.getString("utf-8");//获得表单项的值
       //接收复选框的值
       if(name.equals("taste"))
       {
        String tasteValue=fileItem.getString("utf-8");
        taste.add(tasteValue);
         tasteValue=taste.toString().substring(1, taste.toString().length()-1);
        System.out.println(name+" "+ tasteValue);
        map.put(name, tasteValue);
       }else
       {
        map.put(name, value);
       }
      }else
      {
       //文件上传项
       //文件上传功能
       //获得文件上传的名称
       String fileName=fileItem.getName();
       if(fileName!=null&&!"".equals(fileName))
       {
        //通过工具类获得唯一文件名
         //将文件名的前面部分截取.jpg
         int idx=fileName.lastIndexOf(".");
         String content= fileName.substring(idx);
        String uuidFileName=  UUID.randomUUID().toString().replace("-", "")+content;
        //获得文件上传的数据
        InputStream is=fileItem.getInputStream();
        //获得文件上传的路径
        String path=request.getServletContext().getRealPath( uploadDirectory);
        //将输入流对接到输出流
         url=path+"\\"+uuidFileName;
        OutputStream os=new FileOutputStream(url);
        int len=0;
        byte[] b=new byte[1024];
        while((len=is.read(b))!=-1)
        {
         os.write(b, 0, len);
        }
        os.flush();
        os.close();
        is.close();
       }
      }
      
      return map; 
     }
     
     }catch(IOException e)
     {
      e.printStackTrace();
     }catch(FileUploadException e)
     {
      e.printStackTrace();
     }
  
 }
}


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
一叶知秋519 2018-04-23 16:33:26

如果写在try块中,程序发生异常后可能执行不到return,所以需要写到catch块外,或者在try块和catch块内都写上也是可以的。另外需要将map定义到try块外面。如果发生异常并捕获后,会执行最后的return语句的。同学可以试一下。以下是个例子:

http://img1.sycdn.imooc.com//climg/5add9a5300017e4805360551.jpg

祝学习愉快!

  • 提问者 liqihang #1
    以前老师课堂上讲的是,如果有finnaly语句,那么会执行它里边的return,我们这里的return居然也能执行,这里是有什么语法吗?比如说只有return语句在函数的末尾,发生异常时会执行,其他函数末尾的语句不会执行
    2018-04-23 16:39:04
  • 一叶知秋519 回复 提问者 liqihang #2
    上面的例子异常已经被捕获到了,所以可以继续执行下去;如果没有捕获,程序是不会继续执行到这个return的,是需要将return写到finally里面。祝学习愉快!
    2018-04-23 19:07:24
  • 提问者 liqihang 回复 一叶知秋519 #3
    我试了下,在try-catch语句中没有return语句的情况下,只有return语句才可以在try-catch语句后输出,其他比如赋值语句,输出语句都会报错。
    2018-04-23 19:50:41
一叶知秋519 2018-04-23 09:52:14

你把return map;写到方法的最后,map的定义写到try块外面,再试下呢~~

  • 提问者 liqihang #1
    老师这个是什么原理?我怎么搞不懂这块?try-catch语句块怎么影响到方法的
    2018-04-23 14:16:48
  • 提问者 liqihang #2
    老师,我查了下,try中的变量再外面无法访问,有个疑问,我们把return语句放到方法最后边,如果try中的代码出现异常,那么最后边的return依旧无法执行,程序依旧无法返回值,那么这也无法保证程序一定能返回值啊
    2018-04-23 14:41:50
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
从网页搭建入门Java Web2018版
  • 参与学习           人
  • 提交作业       1088    份
  • 解答问题       10205    个

如果你有Java语言基础,又想以后从事Java Web开发,那么本路径是你的不二选择!本路径从网页搭建开始入手,通过大量案例来学习Java Web基础。定能助你完成Java Web小白的蜕变!

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师